Skip to main content
 首页 » 编程设计

python之Spark : how to generate several elements in map (python)

2024年08月22日34cyq1162

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

我想要的是:

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

其中函数为每对返回几个 (Value, New_value)。请注意,New_value 还取决于 Key!

所以,简单地说,在

上使用 .map() 之后
(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')]