Spark - 计算每个样本的特征总和

时间:2017-06-08 20:51:44

标签: python apache-spark

如果我有一个如下所示的RDD,那么我知道如何计算每个样本数据的功能总和:

import numpy as np
from pyspark import SparkContext

x = np.arange(10) # first sample with 10 features [0 1 2 3 4 5 6 7 8 9]
y = np.arange(10) # second sample with 10 features [0 1 2 3 4 5 6 7 8 9]
z = (x,y)
sc = SparkContext()
rdd1 = sc.parallelize(z)
rdd1.sum()

输出将是这样的数组:([0,2,4,6,8,10,12,14,16,18]),这就是我想要的。

我的问题是: 如果我通过解析如下的csv文件来构造RDD,其中RDD的每个元素都是元组或列表。如何计算上面的每个元组/列表元素(每个特征)的总和?如果我使用总和,我会收到此错误:

Rdd :  [(0.00217010083485, 0.00171658370653), (7.24521659993e-05, 4.18413109325e-06), ....]

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

[编辑] 更具体一点:

rdd = sc.parallelize([(1,3),(2,4)])

我希望我的输出为[3,7]。每个元组都是我拥有的数据实例,元组的每个元素都是我的特性。我想计算每个数据样本的每个特征的总和。

3 个答案:

答案 0 :(得分:2)

在这种情况下,您将需要reduce方法,压缩两个连续的元组并逐个元素地添加它们:

rdd.reduce(lambda x, y: [t1+t2 for t1, t2 in zip(x, y)])
# [3, 7]

答案 1 :(得分:0)

您可以这样做:

z = zip(x, y)
#z is [(0, 0), (1, 1), (2, 2) ......]
map(np.sum, z)

应该这样做。

答案 2 :(得分:0)

在这里,我只是使用PySpark数据框为您拥有的更大的rdd

添加解决方案
rdd = sc.parallelize([(1, 3),(2, 4)])
df = rdd.toDF() # tranform rdd to dataframe
col_sum = df.groupby().sum().rdd.map(lambda x: x.asDict()).collect()[0]
[v for k, v in col_sum.asDict().items()] # sum of columns: [3, 7]