有没有办法将聚合函数应用于数据帧的所有(或列表)列groupBy?换句话说,有没有办法避免为每一列执行此操作:
df.groupBy("col1")
.agg(sum("col2").alias("col2"), sum("col3").alias("col3"), ...)
Run Code Online (Sandbox Code Playgroud) 我有如下数据.文件名:babynames.csv.
year name percent sex
1880 John 0.081541 boy
1880 William 0.080511 boy
1880 James 0.050057 boy
Run Code Online (Sandbox Code Playgroud)
我需要根据年份和性别对输入进行排序,我希望输出汇总如下(此输出将分配给新的RDD).
year sex avg(percentage) count(rows)
1880 boy 0.070703 3
Run Code Online (Sandbox Code Playgroud)
我不确定如何在pyspark中执行以下步骤.需要你的帮助
testrdd = sc.textFile("babynames.csv");
rows = testrdd.map(lambda y:y.split(',')).filter(lambda x:"year" not in x[0])
aggregatedoutput = ????
Run Code Online (Sandbox Code Playgroud) 对于以下数据帧
df=spark.createDataFrame(data=[('Alice',4.300),('Bob',7.677)],schema=['name','High'])
Run Code Online (Sandbox Code Playgroud)
当我试图找到最小值和最大值时,我只输出最小值.
df.agg({'High':'max','High':'min'}).show()
Run Code Online (Sandbox Code Playgroud)
+-----------+
|min(High) |
+-----------+
| 2094900|
+-----------+
Run Code Online (Sandbox Code Playgroud)
为什么agg()不能像熊猫一样给出最大和最小?
我想计算平均值,并在Pyspark中按语句归为一组。我怎样才能做到这一点?
df = spark.createDataFrame([(1, 'John', 1.79, 28,'M', 'Doctor'),
(2, 'Steve', 1.78, 45,'M', None),
(3, 'Emma', 1.75, None, None, None),
(4, 'Ashley',1.6, 33,'F', 'Analyst'),
(5, 'Olivia', 1.8, 54,'F', 'Teacher'),
(6, 'Hannah', 1.82, None, 'F', None),
(7, 'William', 1.7, 42,'M', 'Engineer'),
(None,None,None,None,None,None),
(8,'Ethan',1.55,38,'M','Doctor'),
(9,'Hannah',1.65,None,'F','Doctor')]
, ['Id', 'Name', 'Height', 'Age', 'Gender', 'Profession'])
Run Code Online (Sandbox Code Playgroud)
#这仅显示平均值,但我需要在其旁边计数。我怎样才能做到这一点?
df.groupBy("Profession").agg({"Age":"avg"}).show()
df.show()
Run Code Online (Sandbox Code Playgroud)
谢谢。
我有一个包含多列的数据框.我希望按其中一个列进行分组,并将其他列聚合一次.假设该表有4列,cust_id,f1,f2,f3,我想通过cust_id进行分组,然后获得avg(f1),avg(f2)和avg(f3).该表将包含许多列.任何提示?
下面的代码是一个好的开始,但由于我有很多列,手动编写它们可能不是一个好主意.
df.groupBy("cust_id").agg(sum("f1"), sum("f2"), sum("f3"))
Run Code Online (Sandbox Code Playgroud) 要使用 pyspark 按 Spark 数据帧进行分组,我使用如下命令:
df2 = df.groupBy('_c1','_c3').agg({'_c4':'max', '_c2' : 'avg'})
Run Code Online (Sandbox Code Playgroud)
结果我得到这样的输出:
+-----------------+-------------+------------------+--------+
| _c1| _c3| avg(_c2)|max(_c4)|
+-----------------+-------------+------------------+--------+
| Local-gov| HS-grad| 644952.5714285715| 9|
| Local-gov| Assoc-acdm|365081.64285714284| 12|
| Never-worked| Some-college| 462294.0| 10|
| Local-gov| Bachelors| 398296.35| 13|
| Federal-gov| HS-grad| 493293.0| 9|
| Private| 12th| 632520.5454545454| 8|
| State-gov| Assoc-voc| 412814.0| 11|
| ?| HS-grad| 545870.9230769231| 9|
| Private| Prof-school|340322.89130434784| 15|
+-----------------+-------------+------------------+--------+
Run Code Online (Sandbox Code Playgroud)
这很好,但有两件事我想念:
avg_c2列avg(_c2)。我想以不同的方式聚合同一列。例如,我可能想知道 column 的最小值和最大值_c4。我尝试了以下方法,但它不起作用:
df2 = df.groupBy('_c1','_c3').agg({'_c4':('min','max'), '_c2' : 'avg'})
有办法实现我所需要的吗?
我有一个spark dataFrame,我想通过多个键聚合值
正如Spark文档所示:
高清GROUPBY(COL1:字符串的cols:字符串*):GroupedData组使用指定的列数据框,这样我们就可以在上面运行聚集
所以我做了以下几点
val keys = Seq("a", "b", "c")
dataframe.groupBy(keys:_*).agg(...)
Run Code Online (Sandbox Code Playgroud)
Intellij Idea会引发以下错误:
- 扩展非重复参数
- 类型不匹配:预期Seq [Column],实际Seq [String]
但是,我可以手动传递多个参数而不会出现错误:
dataframe.groupBy("a", "b", "c").agg(...)
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:我如何以编程方式执行此操作?
apache-spark ×6
pyspark ×4
group-by ×2
python ×2
scala ×2
average ×1
count ×1
dataframe ×1
pyspark-sql ×1
python-2.7 ×1