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
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:
Vous pouvez créer une séquence de DataFrame
s puis utiliser reduce
:
val results = fruits.
map(fruit => Seq(("aaa", "bbb", fruit)).toDF("aCol","bCol","name")).
reduce(_.union(_))
results.show()
Dans une boucle for:
val fruits = List("Apple", "orange", "melon")
( for(f <- fruits) yield ("aaa", "bbb", f) ).toDF("aCol", "bCol", "name")
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 _)
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|
+----+----+------+
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.