pyspark:groupby和aggregate avg以及多列上的first
我有一个pyspark dataframe示例,在groupby之后,我想计算平均值,在多个列中的第一列,在实际情况中,我有100个列,所以我不能单独计算pyspark:groupby和aggregate avg以及多列上的first,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一个pyspark dataframe示例,在groupby之后,我想计算平均值,在多个列中的第一列,在实际情况中,我有100个列,所以我不能单独计算 sp = spark.createDataFrame([['a',2,4,'cc','anc'], ['a',4,7,'cd','abc'], ['b',6,0,'as','asd'], ['b', 2, 4, 'ad','acb'], ['c', 4, 4, 'sd','acc']], ['i
sp = spark.createDataFrame([['a',2,4,'cc','anc'], ['a',4,7,'cd','abc'], ['b',6,0,'as','asd'], ['b', 2, 4, 'ad','acb'],
['c', 4, 4, 'sd','acc']], ['id', 'col1', 'col2','col3', 'col4'])
+---+----+----+----+----+
| id|col1|col2|col3|col4|
+---+----+----+----+----+
| a| 2| 4| cc| anc|
| a| 4| 7| cd| abc|
| b| 6| 0| as| asd|
| b| 2| 4| ad| acb|
| c| 4| 4| sd| acc|
+---+----+----+----+----+
这就是我正在尝试的
mean_cols = ['col1', 'col2']
first_cols = ['col3', 'col4']
sc.groupby('id').agg(*[ f.mean for col in mean_cols], *[f.first for col in first_cols])
但它不起作用。如何使用pyspark实现这种功能多列上的多个函数的最佳方式是使用.agg(*expr)格式 结果将是
tst_r.show()
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
|col4|min_col1|min_col2|min_col3|max_col1|max_col2|max_col3|mean_col1|mean_col2|mean_col3|first_col1|first_col2|first_col3|
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
| 5| 5| 6| 7| 7| 8| 9| 6.0| 7.0| 8.0| 5| 6| 7|
| 4| 1| 2| 3| 3| 4| 5| 2.0| 3.0| 4.0| 1| 2| 3|
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
对于在列上选择性地应用函数,可以使用多个表达式数组并在聚合中连接它们
fn_l = [F.min,F.max]
fn_2=[F.mean,F.first]
col_l=['col1','col2']
col_2=['col1','col3','col4']
expr1 = [fn(coln).alias(str(fn.__name__)+'_'+str(coln)) for fn in fn_l for coln in col_l]
expr2 = [fn(coln).alias(str(fn.__name__)+'_'+str(coln)) for fn in fn_2 for coln in col_2]
tst_r = tst.groupby('col4').agg(*(expr1+expr2))
对于多列上的多个函数,最好的方法是使用.agg(*expr)格式 结果将是
tst_r.show()
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
|col4|min_col1|min_col2|min_col3|max_col1|max_col2|max_col3|mean_col1|mean_col2|mean_col3|first_col1|first_col2|first_col3|
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
| 5| 5| 6| 7| 7| 8| 9| 6.0| 7.0| 8.0| 5| 6| 7|
| 4| 1| 2| 3| 3| 4| 5| 2.0| 3.0| 4.0| 1| 2| 3|
+----+--------+--------+--------+--------+--------+--------+---------+---------+---------+----------+----------+----------+
对于在列上选择性地应用函数,可以使用多个表达式数组并在聚合中连接它们
fn_l = [F.min,F.max]
fn_2=[F.mean,F.first]
col_l=['col1','col2']
col_2=['col1','col3','col4']
expr1 = [fn(coln).alias(str(fn.__name__)+'_'+str(coln)) for fn in fn_l for coln in col_l]
expr2 = [fn(coln).alias(str(fn.__name__)+'_'+str(coln)) for fn in fn_2 for coln in col_2]
tst_r = tst.groupby('col4').agg(*(expr1+expr2))
如果您没有在聚合函数中调用列名,可以尝试
f.mean(col)
而不是f.mean
,它可以sp.groupBy('id').agg(*[f.mean(col)表示平均值中的col],*[f.first(col)表示第一列中的col])。show()
您没有在聚合函数中调用列名,您可以尝试f.mean(col)
而不是f.mean
,它可以sp.groupBy('id').agg(*[f.mean(col)代表col in mean_cols],*[f.first(col)代表col in first_cols])。show()
在您的解决方案中,您正在对所有列应用所有函数,但我特别希望在少数列上使用很少的函数,我怎么能用它来做呢expr@ManuSharma-已更新答案,检查其是否有效。您可以定义多个数组并在agg表达式中连接它们高兴地听到:-)在您的解决方案中,您在所有列上应用了所有函数,但我希望在少数列上使用很少的函数,具体来说,如何使用expr@ManuSharma-已更新答案,检查其是否有效。您可以定义多个数组并在agg表达式中连接它们高兴地听到:-)