2017-04-19 69 views
1

有沒有辦法獲得聯合數據幀在循環中的數據幀?斯卡拉 - 火花:如何聯合循環中的所有數據幀

這是一個示例代碼

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 ..但我只需要在Loop中獲取union數據框..因爲有各種操作,比如join,withColumn in Loop。我將從Loop中的hiveSql獲取數據幀。 –

+0

「聯合數據框在循環中」以及...只是這一個說法讓我無法回答這個問題。爲什麼你需要這個「聯合數據框循環」?你能否詳細說明你的問題 - 「各種操作,如連接,循環中的列」。 –

1

你可以先創建一個序列,然後使用toDF創建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| 
+----+----+------+ 
+0

爲什麼你覺得需要在這裏引入'var'? –

+0

實際上,我嘗試的是創建一個'Seq'並將其轉換爲數據框,因爲我遍歷水果列表並將其附加到同一個變量中,所以我將它作爲'var'。 –

+0

OP使用了'var',但他實際上並不需要它。而且,您可以將'fruits'映射到您的'dseq'中。這裏需要注意的重要一點是你的'dseq'是一個'List'。然後你在'for''循環中追加到這個列表中。問題在於'List'上的'append'是'O(n)'使得你的整個'dseq'生成'O(n^2)',這隻會導致大數據性能下降。 –

2

在for循環:

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

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

你可以創造編輯一個DataFrame s的序列,然後用reduce

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

results.show() 
+0

喜歡減少方法.. –