Pyspark应用基于键的不同reduce功能

时间:2018-08-09 19:41:27

标签: python apache-spark pyspark rdd

说我有一些看起来像这样的数据

data =[('yes_sum', np.array([2, 2, 2])),
 ('yes_sum', np.array([3, 3, 3])),
 ('no_sum', np.array([4, 4, 4])),
 ('no_sum', np.array([6, 6, 6]))]

我将其转换为rdd。

rdd_data = sc.parallelize(data)

我想对键为'yes_sum'的数组求和,但将键为'no_sum'的数组合并在一起。所以看起来像这样:

[('yes_sum', array([5, 5, 5])), ('no_sum', array([4, 4, 4, 6, 6, 6]))]

我只知道如何使用以下键对数组求和:

rdd_data.reduceByKey(lambda x,y: x + y).collect()

我得到的:

[('yes_sum', array([5, 5, 5])), ('no_sum', array([10, 10, 10]))]

但这不是我想要的。我在想这样的事情:

rdd_data.reduceByKey(
    lambda x,y: if x.key() == 'yes_sum' x+y else np.concatenate((x, y))
).collect() 

1 个答案:

答案 0 :(得分:1)

首先,您的语法:

.bat

不正确。相反,您可以编写:

lambda x,y: if x.key() == 'yes_sum' x+y else np.concatenate((x, y))

但这会导致:

  

lambda x,y: x+y if x.key() == 'yes_sum' else np.concatenate((x, y))

在执行AttributeError: 'numpy.ndarray' object has no attribute 'key'时,reduce函数本身不知道reduceByKey部分。 Spark已经完成了将类似键的数据分组在一起的工作,并将其传递给适当的reducer。

为了完成您想要的工作,您需要先key filter,然后再调用rdd。然后,您可以根据过滤条件应用其他reduceByKey函数,并合并结果。

例如:

reduce