使用DataFrame.foreachPartition将分区作为数据帧处理

时间:2018-10-05 05:12:38

标签: apache-spark partitioning

我有一个被col0分区的数据框;每个col0值在DF中有很多行。我有一个数据库,我想使用每个分区中的col0的值从中提取数据,但是我一生都无法弄清楚如何使用foreachPartition,因为它返回Iterator[Row]

这是我想做的事情的伪代码:

var df = spark.read.parquet(...).repartition(numPartitions, "col0")
df.foreachPartition((part_df : DataFrame) => {
  val values = part_df.select("col0").distinct
  val sql = "select * from table0 where col0 in (${values})" // or some smarter method :)
  val db_df = spark.read.jdbc(..., table = sql)
  part_df.join(db_dv, "col0") // and/or whatever else
})

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法找到一种优雅的解决方案,但是却找到了一个优雅的解决方案。

写出文件系统时,Spark将为每个分区写一个单独的文件。然后,您可以使用文件系统列出文件,然后分别作为一个单独的数据帧读取和操作每个文件。