2016-03-03 99 views
1

[我們正在測試一個驅動程序,它可以在優化時提供出色的並行性。訣竅是,它不會在Spark分區內並行(訪問DB2),所以要求我們告訴它我們需要多少個並行線程,並且爲每個線程引入一個查詢。雖然我曾希望在一個DataFrame對象數組的循環中做到這一點,但我無法弄清楚如何用一組DataFrame對象編寫一個scala。對於我做的蠻力測試:Scala/Spark數據框數組

val DF1 = sqlContext.read.format("jdbc"). ...yada yada 
    val DF2 = sqlContext.read.format("jdbc"). ...yada yada 
    val DF3 = sqlContext.read.format("jdbc"). ...yada yada 
    val DF4 = sqlContext.read.format("jdbc"). ...yada yada 

    val unionDF=(((DF1.unionAll(DF2)).unionAll(DF3)).unionAll(DF4)) 

這對於並行化到4個分區非常有效。我寧願做一個循環,但然後它會出現我需要像這樣:

var myDF = new Array [DataFrame](parallelBreakdown)...並且DataFrame不是類型。任何關於這樣做的想法都不會使用暴力方法嗎?謝謝,

+2

_it不在Spark分區_中並行化(在訪問DB2中) - 爲什麼不簡單地增加分區數?你想要的只是一個關於Scala集合標準操作的問題,但看起來像XY問題。 – zero323

+0

一個循環...你在說什麼像'Seq(DF1,DF2,DF3,DF4).reduce(_.unionAll(_))'? –

+0

首先,感謝您的回覆。我需要單獨執行這些操作的原因是我正在測試一個新的驅動程序,該驅動程序適用於其自身的並行化形式。但是,與Spark不同,我可以指定分區,下限,yada yada,我需要識別#..併爲每個分區提交一個單獨的查詢。我的想法是,定義一個DataFrame對象的數組然後通過1到NumPartition的範圍來驅動一個循環會很好。然後unionAll數組的每個元素。當我在循環中寫入同一個DF對象時,它有點奏效,但它並沒有並行化。再次感謝 –

回答

0

據幀確實是一個類型

import org.apache.spark.sql.DataFrame 

我能夠定義一個函數

def querier(dim_vals: Array[String]): = { 
    dim_vals.flatMap(dim_val => 
     sql(MY_QUERY)) 
    } 

返回Array[DataFrame],我能夠用Robert Congiu的回答創建一個單一的數據幀,並致電.show()就可以了。