Spark groupByKey另类

Adr*_*ida 12 python reduce apache-spark rdd pyspark

根据Databricks的最佳实践,groupByKey应该避免使用Spark ,因为Spark groupByKey处理的工作方式是首先将信息拖放到工作人员之间,然后进行处理.说明

所以,我的问题是,有哪些替代方案能够groupByKey以分布式和快速的方式返回以下内容?

// want this
{"key1": "1", "key1": "2", "key1": "3", "key2": "55", "key2": "66"}
// to become this
{"key1": ["1","2","3"], "key2": ["55","66"]}
Run Code Online (Sandbox Code Playgroud)

在我看来,可能aggregateByKey或者glom可以先在partition(map)中执行,然后将所有列表连接在一起(reduce).

maa*_*asg 18

groupByKey 如果我们想要每个键的"小"值集合,就像在问题中一样.

TL; DR

"不使用"警告groupByKey适用于两个一般情况:

1)您希望聚合值:

  • 不要:rdd.groupByKey().mapValues(_.sum)
  • :rdd.reduceByKey(_ + _)

在这种情况下,groupByKey废物将实现一个集合的实现,而我们想要的只是一个元素作为答案.

2)您希望通过低基数键对非常大的集合进行分组:

  • 不要:allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
  • 只是不

在这种情况下,groupByKey可能会导致OOM错误.

groupByKey在一个执行程序中实现具有相同键的所有值的集合.如上所述,它具有内存限制,因此,根据具体情况,其他选项更好.

所有分组的功能,如groupByKey,aggregateByKeyreduceByKey依靠的基础上:combineByKey因此没有其他替代的方法是在讨论的用例较好,它们都依赖于相同的公共过程.

  • 当您的归约运算未关联时,最佳处理方法是什么?也就是说,如果我需要对groupByKey进行排序,对分组进行排序,将函数应用于已排序列表,则不能使用reduceByKey。我应该使用partitionBy + mapPartitions代替groupByKey + mapValues来避免OOM错误吗?为每个键创建分区是否存在问题? (2认同)