【发布时间】:2026-01-26 15:15:01
【问题描述】:
我有一个(相当大,想想 10e7 行)DataFrame,我根据某些属性从中过滤元素
val res = data.filter(data(FieldNames.myValue) === 2).select(pk.name, FieldName.myValue)
我的 DataFrame 有 n 个 Partitions data.rdd.getNumPartitions
现在我想知道我的行来自哪个分区。我知道我可以像这样遍历所有分区
val temp = res.first() //or foreach, this is just an example
data.foreachPartition(f => {
f.exists(row => row.get(0)==temp.get(0))
//my code here
}) //compare PKs
或data.rdd.mapPartitionsWithIndex((idx, f) => ...)
但是,如果我的结果和我的 DataFrame 变大,这似乎过度而且性能也不是很好。
在我执行了 filter() 操作之后,是否有 Spark 方式来执行此操作?
或者,有没有办法重写/替代 filter() 语句,以便它返回行的原点?
我也可以将分区位置保存在我的 DataFrame 中并在重新分区时更新它,但我宁愿以火花方式进行
(我发现的唯一类似问题是here,无论是问题还是评论都不是很有帮助。我还发现this可能相似但不一样)
在此先感谢您的任何帮助/指点,如果我错过了与我类似的已回答的问题,我深表歉意。
【问题讨论】:
-
mapPartitionsWithIndex 是一个简单的地图操作。它不涉及洗牌,只是分布式映射。可能还有另一种方法,但我不确定它是否真的比这更有效。
标签: apache-spark apache-spark-sql rdd spark-dataframe hadoop-partitioning