是否有使用pyspark计算列平均值的代码?

时间:2019-05-14 20:01:25

标签: apache-spark pyspark apache-spark-sql

我想使用Spark RDD和数据框计算每个城市的平均Enternum(按城市分组)。 (我想两种方式都可以)

此外,在计算平均值时如何忽略前两个标题行?

我尝试使用RDD和数据帧。但是都失败了。

这是输入的csv文件。

  

城市,类型,enterdate,enternum

     

县市,军种类别,入营日期,入营人数

     

台北市,陆军,1040713,150

     

台北市,陆军,1040813,210

     

台北市,陆军,1040827,180

     

台北市,陆军,1040915,300

这是python代码:

if __name__=="__main__":

#RDD
rdd = sc.textFile("junren.csv").flatMap(lambda line: line.split(",")[3])
rdd.mean().show()

#datefrmae
sqlContext = SQLContext(sc)
df = sqlContext.read.load('junren.csv',format='com.databricks.spark.csv',header='true',inferSchema='true',encoding='UTF-8') 

df.mean("enternum").show()
#df.groupBy('city').agg(avg(col('enternum'))).show()

这是数据帧错误:

  

回溯(最近通话最近):文件   “ C:\ Users \ pc95 \ eclipse-workspace \ demo2 \ src \ Test7.py”,第49行,在          df.mean(“ enternum”)。show()文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ sql \ dataframe.py”,   第1300行,位于 getattr       “'%s'对象没有属性'%s'”%((自身。名称,名称))AttributeError:'DataFrame'对象没有属性'mean '

这是RDD错误:

  

org.apache.spark.api.python.PythonException:追溯(最新   最后调用):文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,   主文件中的第377行   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,   行372,正在处理文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第2499行,在pipeline_func中       返回func(split,prev_func(split,迭代器))文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第2499行,在pipeline_func中       返回func(split,prev_func(split,迭代器))文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   352行,在func中       返回f(iterator)文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   1065行,在       返回self.mapPartitions(lambda i:[StatCounter(i)])。reduce(redFunc)文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ statcounter.py”,    init 中的第43行       self.merge(v)文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ statcounter.py”,   第47行,合并       增量=值-self.mu

     

19/05/15 04:46:01错误TaskSetManager:阶段1中的任务1失败1   时代正在中止作业回溯(最近一次呼叫最近):文件   “ C:\ Users \ pc95 \ eclipse-workspace \ demo2 \ src \ Test7.py”,第40行,在          rdd.mean()。show()文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第1202行,平均       返回self.stats()。mean()文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第1065行,在统计资料中       返回self.mapPartitions(lambda i:[StatCounter(i)])。reduce(redFunc)文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   行844,在reduce中       vals = self.mapPartitions(func).collect()文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   收集中的第816行       sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ py4j-0.10.7-src.zip \ py4j \ java_gateway.py”,   第1257行,在通话文件中   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ py4j-0.10.7-src.zip \ py4j \ protocol.py”,第328行,位于get_return_value py4j中。 protocol.Py4JJavaError:错误   通话时发生   z:org.apache.spark.api.python.PythonRDD.collectAndServe。 :   org.apache.spark.SparkException:由于阶段失败,作业中止了:   阶段0.0中的任务1失败1次,最近一次失败:任务1.0丢失   在阶段0.0(TID 1,本地主机,执行程序驱动程序)中:   org.apache.spark.api.python.PythonException:追溯(最新   最后调用):文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,   主文件中的第377行   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,   行372,正在处理文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第2499行,在pipeline_func中       返回func(split,prev_func(split,迭代器))文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   第2499行,在pipeline_func中       返回func(split,prev_func(split,迭代器))文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   352行,在func中       返回f(iterator)文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ pyspark \ rdd.py”,   1065行,在       返回self.mapPartitions(lambda i:[StatCounter(i)])。reduce(redFunc)文件   “ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ statcounter.py”,    init 中的第43行       self.merge(v)文件“ C:\ Users \ pc95 \ Downloads \ spark-2.4.2-bin-hadoop2.7 \ python \ lib \ pyspark.zip \ pyspark \ statcounter.py”,   第47行,合并       增量=值-self.mu TypeError:-不支持的操作数类型:“ str”和“ float”

1 个答案:

答案 0 :(得分:0)

从错误的最后一行开始,我认为您的列的类型为“字符串”。因此,我正在使用SQL cast方法将其转换为“整数”类型。

from pyspark.sql import functions as F
from pyspark.sql.types import IntegerType

#Entire column average
df.select(F.avg(df.enternum.cast(IntegerType()))).show()

#City wise average
df.groupby('City').agg(F.avg(df.enternum.cast(IntegerType())).alias('Average_enternum')).show()