首页 > 解决方案 > 使用 DataFrame.foreachPartition,将分区处理为数据帧

问题描述

col0我有一个由;分区的数据框 DF 中的每个值有很多行col0。我有一个数据库,我想使用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
})

有任何想法吗?

标签: apache-sparkpartitioning

解决方案


我无法找到一个优雅的解决方案,但我能够找到一个不优雅的解决方案。

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


推荐阅读