我想使用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”
答案 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()