pyspark过滤代码的性能分析

时间:2017-02-21 16:42:33

标签: python pyspark

此代码是我编辑的"摘要统计"在https://spark.apache.org/docs/latest/mllib-statistics.html。具体来说,我使用pDataI = mat.zipWithIndex().filter(lambda x: x[1] > 0).map(lambda x: x[0])

过滤混合的String和float值

打破这个局面:

mat.zipWithIndex() is O(sizeOf mat)
filter(lambda x: x[1] > 0) is O(sizeOf mat)
map(lambda x: x[0]) is O(sizeOf mat)

我似乎正在执行大量计算,只是删除第一行 集合。

整个代码:

import numpy as np
from pyspark.mllib.stat import Statistics

data = []

data.append('c1,c2,c3')
data.append(np.array([1.0, 10.0, 100.0]))
data.append(np.array([2.0, 20.0, 200.0]))
data.append(np.array([3.0, 30.0, 300.0]))

mat = sc.parallelize(
    data
)  # an RDD of Vectors

pDataI = mat.zipWithIndex().filter(lambda x: x[1] > 0).map(lambda x: x[0])
summary = Statistics.colStats(pDataI)

print(summary.mean())  # a dense vector containing the mean value for each column
print(summary.variance())  # column-wise variance
print(summary.numNonzeros())  # number of nonzeros in each column

print pDataI.stats();

打印:

[   2.   20.  200.]

[  1.00000000e+00   1.00000000e+02   1.00000000e+04]

[ 3.  3.  3.]

(count: 3, mean: [   2.   20.  200.], stdev: [  0.81649658   8.16496581  81.64965809], max: [   3.   30.  300.], min: [   1.   10.  100.])

这可以改进,只需一次处理mat集合吗?

1 个答案:

答案 0 :(得分:0)

对于我的钱,DataFrames总是比RDD更好的解决方案。我将假设在真实的工作环境中,您的数据存储在某种文件或集合或其他任何内容中(csv,parquet,json等)。我们现在假设一个csv。在这种情况下,您只需执行以下操作:

df = sqlContext.read.csv('filename.csv', header=True)

从那里,您可以使用df.describe()获取摘要统计信息。

Here是DataFrameReader的文档,包括您可以阅读的所有文件类型和集合。