当前位置: 首页 > 知识库问答 >
问题:

Spark dataframe reduceByKey

章琛
2023-03-14

我使用的是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也不能这样做

任何帮助都将不胜感激。

共有1个答案

山阳辉
2023-03-14

要简单地保留已经实现的分区,请在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

 类似资料:

相关问答

相关文章

相关阅读