我有包含键和值列表的数据。
    rdd =(键,[值])

我想要的是:

rdd.map(lambda pair: func(pair))


其中,函数对每对返回几个(值,新值)。注意,New_value也取决于Key!

因此,简单地说,在

(key1, [Value1, Value2])
(key2, [Value3, Value4, Value5])


我想收到:

(Value1, NewValue1)
(Value2, NewValue2)
(Value3, NewValue3)
(Value4, NewValue4)
(Value5, NewValue5)


如何在PySpark中制作?

最佳答案

设func为连接的键值。

def func(kv):
    return '-'.join(kv)


您想将所有列表展平为(键,值)对

rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1]))


然后在所有对中映射func,同时保留初始值作为结果的一部分

 map(lambda kv: (kv[1], func(kv)))


总共,

rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1])).map(lambda kv: (kv[1], func(kv)))




>>> rdd = sc.parallelize([('k1', ['v1', 'v2']), ('k2', ['v3','v4','v5'])])
>>> rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1])).map(lambda kv: (kv[1], func(kv))).collect()
[('v1', 'k1-v1'),
 ('v2', 'k1-v2'),
 ('v3', 'k2-v3'),
 ('v4', 'k2-v4'),
 ('v5', 'k2-v5')]

关于python - Spark:如何在Map(Python)中生成几个元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36991622/

10-10 12:34