在pyspark中组合值列表

时间:2016-04-10 01:14:35

标签: python-3.x apache-spark lambda pyspark

在RDD上执行收集给了我一个列表。我使用代码

迭代它以打印结构
for entry in ratings_and_users.collect():
        print(entry)

输出是,

(b'"20599"', ([7.0, b'"349802972X"'], ['bamberg, franken, germany', 'NULL']))
(b'"120675"', ([0.0, b'"0972189408"'], ['crescent city, california, usa', 45]))
(b'"166487"', ([6.0, b'"8422626993"'], ['santander, n/a, spain', 103]))
(b'"166487"', ([7.0, b'"8440639228"'], ['santander, n/a, spain', 103]))

在pyspark中,我需要编写一个lambda,将值中的所有列表连接到一个列表中。例如,在上面的输出中,每一行都是一个键值对,键b'"166487"'有一个列表作为其值([7.0, b'"8440639228"'], ['santander, n/a, spain', 103])。该值包含多个列表,如何在RDD上执行collect之前将它们加入到单个列表中

必需的输出结构:

(b'"166487"', ([7.0, b'"8440639228"', 'santander, n/a, spain', 103]))

1 个答案:

答案 0 :(得分:0)

问题是我将每个项目从收集操作的结果视为一个键值对,而是它是一个Tuple,其中键作为第一个条目和值,第二个。所以我迭代然后使用以下lambda,我得到了结果。

def append_values_inside(key, value):
    temp = []
    for v in value:
        for entry in v:
            temp.append(entry)
    return (key, temp)
for entry in ratings_and_users.map(lambda a: append_values_inside(a[0], a[1])).collect() :
        print(entry)

最终结果:

(b'"20599"', [7.0, b'"349802972X"', 'bamberg, franken, germany', 'NULL'])
(b'"120675"', [0.0, b'"0972189408"', 'crescent city, california, usa', 45])
(b'"166487"', [6.0, b'"8422626993"', 'santander, n/a, spain', 103])
(b'"166487"', [7.0, b'"8440639228"', 'santander, n/a, spain', 103])