【发布时间】:2020-10-31 21:34:05
【问题描述】:
我正在解决一个问题,我必须使用 PySpark 中的 map() 函数将大约 700 万个列表值对转换为键值对,其中给定列表值对中使用的列表长度可以是最多 20 个。
例如:
listVal= [(["ank","nki","kit"],21),(["arp","rpi","pit"],22)]
现在,我想要键值对
keyval= [("ank",21),("nki",21),("kit",21),("arp",22),("rpi",22),("pit",22)]
当我写作时
keyval= listval.map(lambda x: some_function(x))
其中 some_function() 定义为:
def some_function(x):
shingles=[]
for i in range(len(x[0])):
temp=[]
temp.append(x[0][i])
temp.append(x[1])
shingles.append(tuple(temp))
return shingles
我没有得到想要的输出,因为我认为 map() 为列表中的一项返回一个键值对,而不是多个键值对。我也尝试过其他事情并在网上搜索但没有找到任何相关的内容。
任何帮助将不胜感激。
【问题讨论】:
-
一定要用地图吗? map 只会返回与迭代一样多的元素,所以这是一个问题
-
@jimakr,是的,我只能使用地图。这是与数据挖掘相关的问题的一部分,我必须为每个 3-shingle 显示一个电影 ID 列表。因此,我使用 map() 为每部电影和电影 ID 制作了一对 3-shingles 列表,但因为它是一个列表 - 单个值对。所以,如果我得到上面的输出,我可以使用 reduceByKey 并得到结果。如果可以通过使用 map 和 reduce 的其他逻辑来解决,如果可能的话,你能告诉我吗?
标签: python-3.x apache-spark pyspark