Map 和 ReduceByKey
输入类型和输出类型reduce
必须相同,因此如果你想聚合一个列表,你必须map
输入到列表。之后,您将这些列表合并为一个列表。
组合列表
您需要一种将列表组合成一个列表的方法。Python 提供了一些组合列表的方法。
append
修改第一个列表并将始终返回None
.
x = [1, 2, 3]
x.append([4, 5])
# x is [1, 2, 3, [4, 5]]
extend
做同样的事情,但解开列表:
x = [1, 2, 3]
x.extend([4, 5])
# x is [1, 2, 3, 4, 5]
两种方法都返回None
,但您需要一个返回组合列表的方法,因此只需使用加号。
x = [1, 2, 3] + [4, 5]
# x is [1, 2, 3, 4, 5]
火花
file = spark.textFile("hdfs://...")
counts = file.flatMap(lambda line: line.split(" ")) \
.map(lambda actor: (actor.split(",")[0], actor)) \
# transform each value into a list
.map(lambda nameTuple: (nameTuple[0], [ nameTuple[1] ])) \
# combine lists: ([1,2,3] + [4,5]) becomes [1,2,3,4,5]
.reduceByKey(lambda a, b: a + b)
组合键
也可以用 来解决这个问题combineByKey
,它在内部用于实现reduceByKey
,但它更复杂,并且“使用 Spark 中专门的每个键组合器可以更快”。对于上面的解决方案,您的用例很简单。
GroupByKey
也可以使用 来解决这个问题groupByKey
,但它会降低并行化,因此对于大数据集可能会慢得多。