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

Using DataFrame.foreachPartition, processing partitions as data frames

我有一个按 col0 分区的数据框;每个 col0 的值在 DF 中有很多行。我有一个数据库,我想在每个分区中使用 col0 的值从中获取批量数据,但我无法终生弄清楚如何使用 foreachPartition,因为它 returns一个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
})

有什么想法吗?

我没能找到一个优雅的解决方案,但我找到了一个不优雅的解决方案。

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