【问题标题】:Mapping a List-Value pair to a key-value pair with PySpark使用 PySpark 将列表值对映射到键值对
【发布时间】: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


【解决方案1】:

所以利用你的限制,这可以通过 pyspark 的 .flatmap() 来完成

def conversion(n):
    return [(x, n[1]) for x in n[0]]


listVal.flatMap(conversion)

或一行

listVal.flatMap(lambda n: [(x, n[1]) for x in n[0]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多