首页 > 解决方案 > (key, {key, value}) 记录中的字典键计数

问题描述

这是作业问题的一部分,也是一个简单的概念问题。我在 PySpark 中有键值记录,其中的值是各种大小的字典。

testRDD.collect() 返回

["2\t{'3': 1}",
 "3\t{'2': 1}",
 "4\t{'1': 1, '2': 1}",
 "5\t{'4': 1, '2': 1, '6': 1}",
 "6\t{'2': 1, '5': 1}",
 "7\t{'2': 1, '5': 1}",
 "8\t{'2': 1, '5': 1}",
 "9\t{'2': 1, '5': 1}",
 "10\t{'5': 1}",
 "11\t{'5': 1}"]

我已经开始了

totalCount = dataRDD.map(lambda x: x.split("\t")) \

为了计算字典中不同键的数量,还有大约 3 行代码需要完成。键(键值)格式的提示(即我的 pyspark 代码的下一行)应该是我需要开始的全部内容。我试图在 flatMap 和 flatMapValues() [使用 lambda 函数] 中使用 .keys() ,但没有成功。对于 .keys(),我被告知我有一个列表,而不是字典。我明白为什么会这样,但我不知道如何处理这个问题。

在我的 pyspark 查询结束时,预期结果将是这个 testRDD 的简单计数 6。

我从类似的问题中看到列表理解可能是解决方案,但我仍然不太熟悉在 map() 中使用它?pyspark 中的 lambda 函数。

标签: pyspark

解决方案


rdd concepts like map, flatMap, distinct对于这个问题,您需要使用python lambda, eval以下步骤: -

让我们从创建 rdd 开始: -

my_rdd = sc.parallelize(["2\t{'3': 1}",
 "3\t{'2': 1}",
 "4\t{'1': 1, '2': 1}",
 "5\t{'4': 1, '2': 1, '6': 1}",
 "6\t{'2': 1, '5': 1}",
 "7\t{'2': 1, '5': 1}",
 "8\t{'2': 1, '5': 1}",
 "9\t{'2': 1, '5': 1}",
 "10\t{'5': 1}",
 "11\t{'5': 1}"
])
my_rdd.collect()

["2\t{'3': 1}",
 "3\t{'2': 1}",
 "4\t{'1': 1, '2': 1}",
 "5\t{'4': 1, '2': 1, '6': 1}",
 "6\t{'2': 1, '5': 1}",
 "7\t{'2': 1, '5': 1}",
 "8\t{'2': 1, '5': 1}",
 "9\t{'2': 1, '5': 1}",
 "10\t{'5': 1}",
 "11\t{'5': 1}"]

\t然后用和evaldict分割:-

new_my_rdd = my_rdd.map(lambda x:eval(x.split("\t")[1]))
new_my_rdd.collect()
[{'3': 1},
 {'2': 1},
 {'1': 1, '2': 1},
 {'2': 1, '4': 1, '6': 1},
 {'2': 1, '5': 1},
 {'2': 1, '5': 1},
 {'2': 1, '5': 1},
 {'2': 1, '5': 1},
 {'5': 1},
 {'5': 1}]

现在仅提取键并用于flatMap将它们转换为行:-

new_my_rdd2 = new_my_rdd.flatMap(lambda x:x.keys())
new_my_rdd2.collect()
['3',
 '2',
 '1',
 '2',
 '2',
 '4',
 '6',
 '2',
 '5',
 '2',
 '5',
 '2',
 '5',
 '2',
 '5',
 '5',
 '5']

最后,计算不同的值:-

new_my_rdd2.distinct().count()
6

推荐阅读