Добавление строк в информационный кадр - PullRequest
0 голосов
/ 08 января 2020

Я хочу добиться ниже для искры датафрейма. Я хочу добавлять новые строки в фрейм данных, как показано в примере ниже.

for(a<- value)
        { 
         val num = a
         val count = a+10
         //creating a df with the above values//
         val data = Seq((num.asInstanceOf[Double], count.asInstanceOf[Double]))
         val row = spark.sparkContext.parallelize(data).toDF("Number","count")
         val data2 =  data1.union(row)
         val data1 = data2 --> currently this assignment is not possible.
         }

Я также пробовал

for(a<- value)
        { 
         val num = a
         val count = a+10
         //creating a df with the above values//
         val data = Seq((num.asInstanceOf[Double], count.asInstanceOf[Double]))
         val row = spark.sparkContext.parallelize(data).toDF("Number","count")
         val data1 =  data1.union(row) --> Union with self is not possible
         }

Как мне добиться этого в искре.

Ответы [ 3 ]

1 голос
/ 08 января 2020

Dataframes являются неизменными, вам нужно будет использовать изменяемые структуры. Вот решение, которое может вам помочь.

scala> val value = Array(1.0, 2.0, 55.0)
value: Array[Double] = Array(1.0, 2.0, 55.0)

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var data = new ListBuffer[(Double, Double)]
data: scala.collection.mutable.ListBuffer[(Double, Double)] = ListBuffer()

scala> for(a <- value)
     | {
     | val num = a
     | val count = a+10
     | data += ((num.asInstanceOf[Double], count.asInstanceOf[Double]))
     | println(data)
     | }
ListBuffer((1.0,11.0))
ListBuffer((1.0,11.0), (2.0,12.0))
ListBuffer((1.0,11.0), (2.0,12.0), (55.0,65.0))

scala> val DF = spark.sparkContext.parallelize(data).toDF("Number","count")
DF: org.apache.spark.sql.DataFrame = [Number: double, count: double]

scala> DF.show()
+------+-----+
|Number|count|
+------+-----+
|   1.0| 11.0|
|   2.0| 12.0|
|  55.0| 65.0|
+------+-----+


scala>
0 голосов
/ 08 января 2020

Просто создайте один DataFrame, используя for-l oop, а затем объедините с data1 следующим образом:

val df = ( for(a <- values) yield (a, a+10) ).toDF("Number", "count")
val result = data1.union(df)

Это было бы намного эффективнее, чем объединение внутри for-l * 1007. *.

0 голосов
/ 08 января 2020

ваш data1 должен быть объявлен как var:

var data1:DataFrame = ???

for(a<- value)
{
  val num = a
  val count = a+10
  //creating a df with the above values//
  val data = Seq((num.toDouble, count.toDouble))
  val row = spark.sparkContext.parallelize(data).toDF("Number","count")
  val data2 =  data1.union(row)
  data1 = data2 
}

Но я бы не советовал делать это, лучше конвертировать все ваши value (должно быть Seq?) В датафрейм, затем объединение один раз. Многие союзы, как правило, неэффективны ....

val newDF = value.toDF("Number")
  .withColumn("count",$"Number" + 10)

val result= data1.union(newDF)
...