我的数据如下:
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})
,但它真的逃避了我如何做到这一点。
答案 0 :(得分:3)
你可以尝试类似的东西
navigationcontroller
希望这有用:)
答案 1 :(得分:1)
替代方法是首先使用键和值对RDD进行排序,然后使用groupBy
和Counter
。
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),
# ...