0
我正在使用Spark實現以下邏輯。將數據幀拆分成更小的數據幀並將大數據幀推送給所有執行者?
- 獲取50K行表的結果。
- 獲取另一張表格(約30K行)。
- 對於(1)和(2)之間的所有組合,做一些工作並獲得價值。
將(2)的數據幀推送到所有執行程序和分區(1)並在每個執行程序上運行每個部分?如何實現它?
val getTable(t String) =
sqlContext.read.format("jdbc").options(Map(
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"url" -> jdbcSqlConn,
"dbtable" -> s"$t"
)).load()
.select("col1", "col2", "col3")
val table1 = getTable("table1")
val table2 = getTable("table2")
// Split the rows in table1 and make N, say 32, data frames
val partitionedTable1 : List[DataSet[Row]] = splitToSmallerDFs(table1, 32) // How to implement it?
val result = partitionedTable1.map(x => {
val value = doWork(x, table2) // Is it good to send table2 to executors like this?
value
})
問:
- 如何破解大數據幀分成小的數據幀? (重新分區?)
- 向這樣的執行器發送table2(傳遞一個大數據幀作爲參數)是否很好?
感謝。你的意思是'val result = table1.map(x => {'(not'partitionedTable1')在你的答案中代碼的第二行?由於數據框會默認分發給所有執行者?不需要手動分割它 – ca9163d9
nope。那不是我的意思,我建議使用dataframe作爲廣播變量,並在其他函數中訪問它,而不是將數據幀作爲參數傳遞。 –
我需要'splitToSmallerDFs()'來將'table1'拆分爲'partitionedTable1:List [DataSet [Row]]'?是否將'table1.map(...)'的執行分配給所有執行者? – ca9163d9