我正在使用 Spark 1.5/1.6,我想在 DataFrame 中进行 reduceByKey 操作,我不想将 df 转换为 rdd。

每行看起来像,我有 id1 的多行。

id1, id2, score, time

我想要这样的东西:
id1, [ (id21, score21, time21) , ((id22, score22, time22)) , ((id23, score23, time23)) ]

所以,对于每个“id1”,我想要一个列表中的所有记录

顺便说一句,不想将 df 转换为 rdd 的原因是因为我必须将这个(减少的)数据帧加入另一个数据帧,并且我正在对连接键进行重新分区,这使它更快,我猜rdd 不能做同样的事情

任何帮助将不胜感激。

最佳答案

为了简单地保留已经实现的分区,然后在 reduceByKey 调用中重新使用父 RDD 分区器:

 val rdd = df.toRdd
 val parentRdd = rdd.dependencies(0) // Assuming first parent has the
                                     // desired partitioning: adjust as needed
 val parentPartitioner = parentRdd.partitioner
 val optimizedReducedRdd = rdd.reduceByKey(parentPartitioner, reduceFn)

如果您不按如下方式指定分区程序:
 df.toRdd.reduceByKey(reduceFn)  // This is non-optimized: uses full shuffle

那么你注意到的行为就会发生 - 即发生完全洗牌。那是因为将使用 HashPartitioner 代替。

关于join - Spark 数据帧 reduceByKey,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37307228/

10-11 03:14