2017-01-18 5 views
2

初心者の質問、 私はデータフレームを存在する列を追加しようと思い、私はスパークで働いています1.4.1IndexedSeq [DataFrame]をDataFrameに変換しますか?

import sqlContext.implicits._ 
case class Test(rule: Int) 

val test = sc.parallelize((1 to 2).map(i => Test(i-i))).toDF 
test.registerTempTable("test") 
test.show 

+----+ 
|rule| 
+----+ 
| 0| 
| 0| 
+----+ 

その後 - 、1列に列を追加 - OK

import org.apache.spark.sql.functions.lit 
val t1 = test.withColumn("1",lit(0)) 
t1.show 

+----+-+ 
|rule|1| 
+----+-+ 
| 0|0| 
| 0|0| 
+----+-+ 

問題が表示されます私はいくつかの列を追加しよう:

val t1 = (1 to 5).map(i => test.withColumn(i,lit(i))) 
t1.show() 

error: value show is not a member of scala.collection.immutable.IndexedSeq[org.apache.spark.sql.DataFrame] 

答えて

1

あなたはが必要プロセスを減らします、代わりにマップを使用するので、あなたはあなたの最初のパラメータとしてテストデータフレームでfoldLeftを使用することができます。

val t1 = (1 to 5).foldLeft(test){ case(df, i) => df.withColumn(i.toString, lit(i))} 

t1.show 
+----+---+---+---+---+---+ 
|rule| 1| 2| 3| 4| 5| 
+----+---+---+---+---+---+ 
| 0| 1| 2| 3| 4| 5| 
| 0| 1| 2| 3| 4| 5| 
+----+---+---+---+---+---+ 
+0

素晴らしいです!ありがとう – Toren

+0

'df'の役割は何ですか? 'test'に追加する' df'を5回作成しますか? – Toren

+0

'df'は、前の段階で生成されたデータフレームを参照します。私は5回データフレームを作成しているとは思わない。 'test.withColumn()。withColumn()...'または 'val df1 = test.withColumn();と同じです。 val df2 = df1.withColumn(); ... '確かに明確な答えを与えるためにスーパーエキスパートではありません。 – Psidom

関連する問題