在Spark中的python中提取元组数组

时间:2015-11-06 19:58:07

标签: python apache-spark rdd

我有一个表格的RDD:

  

(2,[你好,嗨,怎么样,是,你])

我需要将这些元组映射为:

  

((2,你好),(2,你好),(2,怎么样),((2,are),(2,你))

我在python中尝试这个:

PairRDD = rdd.flatMap(lambda (k,v): v.split(',')).map(lambda x: (k,x)).reduceByKey())

这不起作用,因为我在地图转换中没有k。我不知道怎么做?有什么意见吗?

提前感谢你。

1 个答案:

答案 0 :(得分:2)

我认为你的核心问题是错误的正确问题。考虑以下代码(我已经在Scala中测试了等效代码,但它在pySpark中应该以相同的方式运行):

PairRDD = rdd.flatMap(lambda (k,v): v.split(',').map(lambda x: (k,x)))

v拆分为字符串列表,然后将该列表映射到(key,string)元组,然后将该列表返回到flatMap,将其拆分为RDD中的多个行。在v.split(',')之后使用额外的右侧parens,你丢弃了密钥(因为你只返回了一个字符串列表)。

原始数据集中的键值是否唯一?如果是这样,并且您想要一个元组列表,那么使用flatMap而不是map,而不是随机播放,您将得到您想要的内容。如果您确实想要合并原始数据集中的多个行,则需要groupByKey,而不是reduceByKey

我也很好奇是否需要拆分 - 是你的元组(Int,String)还是(Int,List(String))?