在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]))
答案 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])