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

发布于 2021-01-29 19:29:50

我正在编写一个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是元组。我的目标是用键和值列表(元组)创建一对。

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

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

    也可以使用来解决此问题groupByKey但是它会降低并行化,因此对于大数据集可能会慢得多。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看