此代码是我编辑的"摘要统计"在https://spark.apache.org/docs/latest/mllib-statistics.html。具体来说,我使用pDataI = mat.zipWithIndex().filter(lambda x: x[1] > 0).map(lambda x: x[0])
打破这个局面:
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
集合吗?
答案 0 :(得分:0)
对于我的钱,DataFrames总是比RDD更好的解决方案。我将假设在真实的工作环境中,您的数据存储在某种文件或集合或其他任何内容中(csv,parquet,json等)。我们现在假设一个csv。在这种情况下,您只需执行以下操作:
df = sqlContext.read.csv('filename.csv', header=True)
从那里,您可以使用df.describe()
获取摘要统计信息。
Here是DataFrameReader的文档,包括您可以阅读的所有文件类型和集合。