python - Spark中通过reduceByKey()或其他函数来减少作业?

标签 python mapreduce apache-spark reduce pyspark

给出以下列表:

[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]

如果列表值的第二个元素是每个键,我需要输出列表值的第一个元素的列表(即, 135, 2409, 12846 对于键 013840 对于键 1 ) (即, 2, 1, 2 代表 02 代表 1 )大于或等于某个值(假设为 2)。例如,在这种特殊情况下,输出应该是:

[(0, [135, 12846]), (1, [13840]), ...]

元组(0, [2409, 1])被丢弃,因为 1 < 2 .

我通过应用 groupByKey() 实现了这一点,一个mapValues(list)最后一个map功能,但很清楚groupByKey()效率低于reduce函数。

仅使用 reduceByKey() 是否可以实现该任务?或combineByKey()功能?

最佳答案

答案是肯定的:) 您可以使用 reduceByKey 实现与使用 groupByKey 相同的效果。事实上,reduceByKey 应该始终受到青睐,因为它在打乱数据之前执行映射端归约。

使用 reduceByKey 的解决方案(在 Scala 中,但我确信您明白这一点,并且如果您愿意,可以轻松地将其转换为 Python):

val rdd = sc.parallelize(List((0, List(135, 2)), (0, List(2409, 1)), (0, List(12846, 2)), (1, List(13840, 2))))
rdd.mapValues(v => if(v(1) >= 2) List(v(0)) else List.empty)
   .reduceByKey(_++_)

关于python - Spark中通过reduceByKey()或其他函数来减少作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863963/

相关文章:

java - python解释器导入错误

Python:BeautifulSoup Findall 跳到下一个标签

python - 绑定(bind)到 wxButton 的 wxPython 弹出窗口

hadoop - 成功的任务在尝试提交时生成 mapreduce.counters.LimitExceededException

apache-spark - 如何使用支持通用 ID 类型(int 和 long)的 Spark ML ALS 实现

python - 检查列表A是否包含列表B中项目的前缀

hadoop - Mapreduce 在访问 master 机器上的 datanode 时返回错误

map - 解释什么是 Hadoop 和 Map/Reduce 的最简单方法是什么?

apache-spark - Spark HiveContext : Spark Engine OR Hive Engine?

apache-spark - Spark 到 MySQL 的 JDBC 写入速度低