Python Spark如何将(键值列表)拆分为键值对
给定一个具有多个键值对的RDD,其中每个值实际上都是一个值列表,如何分割值列表,以得到简单的键值对Python Spark如何将(键值列表)拆分为键值对,python,pyspark,Python,Pyspark,给定一个具有多个键值对的RDD,其中每个值实际上都是一个值列表,如何分割值列表,以得到简单的键值对 from pyspark import SparkConf, SparkContext conf = SparkConf() sc = SparkContext(conf=conf) foo = sc.parallelize([(0,[1,1,4]),(1,[3,5])]) bar = foo.map(magic) bar.collect() >>>>[(0,1),(0,1
from pyspark import SparkConf, SparkContext
conf = SparkConf()
sc = SparkContext(conf=conf)
foo = sc.parallelize([(0,[1,1,4]),(1,[3,5])])
bar = foo.map(magic)
bar.collect()
>>>>[(0,1),(0,1),(0,4),(1,3),(1,5)]
要实现我想要的,magic会是什么样子?Python允许您任意组合多个生成器表达式,本质上允许您“展开”这样的嵌套结构。每个“层”都将是一个新的
lambda l:[(键,值)代表(键,值)代表l中的值代表值中的值]
>>l=[(0[1,1,4]),(1[3,5])]
>>>[(键,值)表示l中的(键,值)表示值中的值]
[(0, 1), (0, 1), (0, 4), (1, 3), (1, 5)]
找到了答案:
bar=foo.flatMap(lambda l: [(l[0], value) for value in l[1]])
我意识到这是一个相当简单的问题和解决方案,但我将把它留给其他人,以防其他人在开始使用pyspark时遇到困难。这似乎对pyspark不起作用。使用lambda函数实现magic,我得到了TypeError:无法解包不可iterable int object这意味着在某种嵌套级别上,您试图“解包”整数类型而不是容器类型。你能准确地粘贴你所尝试的吗?bar=foo.map(lambda l:[(key,value)for(key,value)for(key,value)for(key,value)in l for value in values])嗯,我可能有点不知所措了。我从python解释器复制了我的第二个代码段,因此假设您使用的是python 3,我认为我们应该看到相同的行为。pyspark可能以某种我看不到的方式在这里发挥作用,在这种情况下,我的答案可能没有帮助:我的答案是泛型Python。