我有一个(相当大,觉得10E7行)数据帧从我基于某些属性过滤元件分区位置
val res = data.filter(data(FieldNames.myValue) === 2).select(pk.name, FieldName.myValue)
我的数据帧有N个分区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) => ...)
然而,这似乎过多,也不是很我的结果高性能和我的数据框变大。
在执行filter()操作后有Spark方法吗?
或者,有没有一种方法来重写/一个替代filter() - 语句,以便它返回行的原点?
我也可以保存分区位置,我的数据帧和更新上重新分区,但我宁愿做一个火花方式
(唯一类似的问题,我发现了here,既不问题我也发现this这可能是相似的,但不一样)
在此先感谢您的任何帮助/指针,我很抱歉,如果我错过了类似于我的问题已被回答。
mapPartitionsWithIndex是一个简单的地图操作。它不涉及洗牌,只是分布式映射。可能有另一种方式,但我不确定它可能比这更真实。 – Marie