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