python - Spark groupByKey 替代方案

标签 python apache-spark pyspark rdd reduce

根据 Databricks 最佳实践,应避免使用 Spark groupByKey,因为 Spark groupByKey 处理的工作方式是,信息将首先在 worker 之间洗牌,然后再进行处理发生。 Explanation

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

// want this
{"key1": "1", "key1": "2", "key1": "3", "key2": "55", "key2": "66"}
// to become this
{"key1": ["1","2","3"], "key2": ["55","66"]}

在我看来,也许 aggregateByKeyglom 可以先在分区 (map) 中完成,然后将所有列表连接在一起 ( 减少)。

最佳答案

groupByKey 适用于我们想要每个键的“小型”值集合的情况,如问题中所示。

长话短说

groupByKey 上的“请勿使用”警告适用于两种一般情况:

1) 您想要聚合值:

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

在这种情况下,groupByKey 将浪费资源实现集合,而我们想要的是单个元素作为答案。

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

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

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

groupByKey 实现了一个集合,其中包含一个执行程序中同一键的所有值。如前所述,它有内存限制,因此,根据情况,其他选项会更好。

所有的分组函数,比如groupByKey , aggregateByKeyreduceByKey 依赖于基础:combineByKey 因此对于问题中的用例,没有其他选择会更好,它们都依赖相同的通用过程。

关于python - Spark groupByKey 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029395/

相关文章:

apache-spark - 文件已经存在pyspark

apache-spark - (python) Spark .textFile(s3 ://. ..) access denied 403 with valid credentials

python - Twitter 用户关注者的随机页面

python - 如何使用 Lib 'dateutil' 转换日期字符串?

apache-spark - Apache Spark Ui 中的自定义指标

scala - 使用 sc.union 时 Spark 堆栈溢出错误

python - Numpy 高级索引失败

python - 如何在 Azure Databricks 笔记本中调试长时间运行的 python 命令?

python - Spark : why is Decimal(36, 16) 6 位数字后四舍五入?

apache-spark - 如何在 Spark 中使用 AND 或 OR 条件