web-dev-qa-db-fra.com

scala - Spark: Comment réunir toutes les données en boucle

Existe-t-il un moyen de mettre en boucle la trame de données de cette trame de données d'union?

c'est un exemple de code

var fruits = List(
    "Apple"
    ,"orange"
    ,"melon"

) 


for (x <- fruits){

           var df = Seq(("aaa","bbb",x)).toDF("aCol","bCol","name")

}

Je voudrais faire un peu comme

aCol | bCol | fruitsName
aaa,bbb,Apple
aaa,bbb,orange
aaa,bbb,melon

Merci encore

3
J.soo

La réponse de Steffen Schmitz est la plus concise que je connaisse. Vous trouverez ci-dessous une réponse plus détaillée si vous souhaitez davantage de personnalisation (types de champs, etc.):

import org.Apache.spark.sql.types.{StructType, StructField, StringType}
import org.Apache.spark.sql.Row

//initialize DF
val schema = StructType(
  StructField("aCol", StringType, true) ::
  StructField("bCol", StringType, true) ::
  StructField("name", StringType, true) :: Nil)
var initialDF = spark.createDataFrame(sc.emptyRDD[Row], schema)

//list to iterate through
var fruits = List(
    "Apple"
    ,"orange"
    ,"melon"
)

for (x <- fruits) {
  //union returns a new dataset
  initialDF = initialDF.union(Seq(("aaa", "bbb", x)).toDF)
}

//initialDF.show()

références:

12
cdncat

Vous pouvez créer une séquence de DataFrames puis utiliser reduce:

val results = fruits.
  map(fruit => Seq(("aaa", "bbb", fruit)).toDF("aCol","bCol","name")).
  reduce(_.union(_))

results.show()
11
Ramon

Dans une boucle for:

val fruits = List("Apple", "orange", "melon")

( for(f <- fruits) yield ("aaa", "bbb", f) ).toDF("aCol", "bCol", "name")
5
Steffen Schmitz

Si vous avez plusieurs/plusieurs images, vous pouvez utiliser le code ci-dessous, ce qui est efficace. 

val newDFs = Seq(DF1,DF2,DF3)
newDFs.reduce(_ union _)
3
Arun Goudar

vous pouvez d'abord créer une séquence, puis utiliser toDF pour créer Dataframe.

scala> var dseq : Seq[(String,String,String)] = Seq[(String,String,String)]()
dseq: Seq[(String, String, String)] = List()

scala> for ( x <- fruits){
     |  dseq = dseq :+ ("aaa","bbb",x)
     | }

scala> dseq
res2: Seq[(String, String, String)] = List((aaa,bbb,Apple), (aaa,bbb,orange), (aaa,bbb,melon))

scala> val df = dseq.toDF("aCol","bCol","name")
df: org.Apache.spark.sql.DataFrame = [aCol: string, bCol: string, name: string]

scala> df.show
+----+----+------+
|aCol|bCol|  name|
+----+----+------+
| aaa| bbb| Apple|
| aaa| bbb|orange|
| aaa| bbb| melon|
+----+----+------+
1
Rajat Mishra

Eh bien ... je pense que votre question est un peu mal orientée.

Selon ma compréhension limitée de tout ce que vous essayez de faire, vous devriez suivre,

val fruits = List(
  "Apple",
  "orange",
  "melon"
)

val df = fruits
  .map(x => ("aaa", "bbb", x))
  .toDF("aCol", "bCol", "name")

Et cela devrait suffire.

0