使用 Apache Spark 将键值对简化为键列表对

2023-11-30

我正在编写一个 Spark 应用程序,想要组合一组键值对(K, V1), (K, V2), ..., (K, Vn)成一个键-多值对(K, [V1, V2, ..., Vn])。我觉得我应该能够使用reduceByKey带有某种味道的函数:

My_KMV = My_KV.reduce(lambda a, b: a.append([b]))

发生这种情况时我得到的错误是:

“NoneType”对象没有属性“append”。

我的键是整数,值 V1,...,Vn 是元组。我的目标是使用键和值列表(元组)创建一对。


映射和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]

Spark

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, 但它减少了并行化因此对于大数据集来说可能会慢得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Apache Spark 将键值对简化为键列表对 的相关文章