我有一个表格的RDD:
(2,[你好,嗨,怎么样,是,你])
我需要将这些元组映射为:
((2,你好),(2,你好),(2,怎么样),((2,are),(2,你))
我在python中尝试这个:
PairRDD = rdd.flatMap(lambda (k,v): v.split(',')).map(lambda x: (k,x)).reduceByKey())
这不起作用,因为我在地图转换中没有k。我不知道怎么做?有什么意见吗?
提前感谢你。
答案 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))?