在聚合数据框上执行操作后,Pyspark冻结

时间:2017-02-06 11:37:06

标签: apache-spark pyspark spark-dataframe

我使用Spark 1.5.2和Python 2.7.5。

我有这个代码,我在pyspark repl中运行:

from pyspark.sql import SQLContext
ctx = SQLContext(sc)

df = ctx.createDataFrame([("a",1),("a",1),("a",0),("a",0),("b",1),("b",0),("b",1)],["group","conversion"])

from pyspark.sql.functions import col, count, avg
funs = [(count,"total"),(avg,"cr")]
aggregate = ["conversion"]
exprs = [f(col(c)).alias(name) for f,name in funs for c in aggregate]
df3 = df.groupBy("group").agg(*exprs).cache()

到目前为止,代码工作正常,我可以检查df3

>>> df3.collect()
[Row(group=u'a', total=4, cr=0.5), Row(group=u'b', total=3, cr=0.6666666666666666)]

然而,当我尝试:

df3.agg(sum(col('cr'))).first()[0]

PySpark无法计算这笔金额。但是df3.rdd.reduce(lambda x,y: x[2]+y[2])工作正常。

那么,计算总和的第一个命令有什么问题?

1 个答案:

答案 0 :(得分:1)

您应首先导入pyspark的sum功能:from pyspark.sql.functions import sum。否则调用python的内置sum,它只是对数字序列求和。