2017-04-19 62 views
1

ループ内のデータフレームを取得する方法はありますか? scala - Spark:ループ内のすべてのデータフレームを結合する方法

この

は、サンプルコード

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

) 


for (x <- fruits){ 

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

} 
ある 私は

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

おかげのようないくつかをしたいと思う

再び

+0

このコードは何ですか。実際にここで何をしようとしていますか? –

+0

これは組合ではありませんが、これはデカルト商品です。 – eliasah

答えて

6

ステファン・シュミッツの答えは、私は信じている最も簡潔なものです。

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() 

参照:

以下 は、あなたがより多くのカスタマイズを探している場合は、より詳細な回答(フィールドタイプの、など)であります
0

うーん...私はあなたの質問だと思いますビットミスガイド。あなたがやろうとしているものは何でも、あなたは以下を実行しなければならないの私の限られた理解あたりとして

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

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

そして、これは十分なはずです。

+0

ありがとうSarvesh ..しかし、私はループ内の結合データフレームを取得する必要があります。ループ内でのjoin、withColumnなどのさまざまな操作があるためです。私はループ内のhiveSqlからデータフレームを取得します。 –

+0

"ループ内のユニオンデータフレーム"まあ...この1つのステートメントだけで私はこの質問に答えることができません。なぜあなたはこの "ユニオンデータフレームinループ"が必要ですか?あなたはあなたの質問で詳細について詳しく述べることができますか?「Join、withColumn in Loopなどのさまざまな操作」 –

1

最初にシーケンスを作成してから、toDFを使用してDataframeを作成することができます。 forループで

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| 
+----+----+------+ 
+0

なぜ、ここで 'var'を導入する必要があると感じましたか? –

+0

実際に私が試みたのは 'Seq'を作成してそれをdataframeに変換することでした。これは果物のリストを繰り返して同じ変数に追加するので、' var'としています。 –

+0

OPは 'var'を使用しましたが、実際には必要ありませんでした。そして、 '' dseq''に 'fruits'を' 'マップする' 'ことができます。ここで重要なのは、 'dseq'が' List'だということです。そしてあなたの 'for'ループでこのリストに追加します。この問題は、 'List'の' append'が 'd(O ^(n^2)'の 'dseq'世代を' O(n) 'とすることで大きなデータのパフォーマンスを殺すだけです。 –

2

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

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

あなたはcreatできますDataFrameのシーケンスを編集してからreduce

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

results.show() 
+0

は、アプローチを減らすのが好きです。 –

関連する問題