在pyspark中将值组合为字典

时间:2017-05-24 07:45:57

标签: python pyspark

我的数据如下:

MFCC_0_D_N_Z

我想要的是一个结构,其中每个键都包含一个包含每个值的字典的字典,如:

main_data = sc.parallelize([
    ('key001', 'value001'),
    ('key001', 'value002'),
    ('key001', 'value001'),
    ('key002', 'value003'),
    ('key002', 'value003'),
    ('key002', 'value001'),
    ('key002', 'value004'),
    ('key003', 'value005'),
    ('key003', 'value006'),
])

我最初的想法是首先将('key001': {'value001': 2, 'value002': 1}, 'key002': {'value003': 2, 'value001': 1, 'value004': 1}, 'key003': {'value005': 1, 'value006': 1}) 的值映射到main_data值,然后我可以对结果求和,如:

1

之后我明白我应该使用main_data.mapValues(lambda t: {t: 1}),但它真的逃避了我如何做到这一点。

2 个答案:

答案 0 :(得分:3)

你可以尝试类似的东西

navigationcontroller

希望这有用:)

答案 1 :(得分:1)

替代方法是首先使用键和值对RDD进行排序,然后使用groupByCounter

from collections import Counter

group_key = main_data.map(lambda x: (*x, 1)).sortBy(lambda x: (x[0], x[1])).groupBy(lambda x: x[0])
count_value = group_key.map(lambda x: (x[0], Counter(x[1])))

考虑使用PySpark Dataframe也会减少一些代码量

from pyspark.sql import functions as func

df = main_data.toDF(['key', 'value'])
gr = df.groupby(['key', 'value'])
count = gr.count()
count.rdd.collect()

# [Row(key='key002', value='value003', count=2),
#  Row(key='key003', value='value005', count=1),
#  ...