【问题标题】:How to group by columns and aggregate rest of the columns如何按列分组并聚合其余列
【发布时间】:2019-01-10 18:59:00
【问题描述】:

我是 pyspark 的新手,如果有人能帮助解决问题,我将不胜感激。

假设我在 pyspark 中有如下数据框:

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|   A|2001|   2|   5|   6|
|   A|2001|   3|   6|  10|
|   A|2001|   3|   6|  10|
|   A|2002|   4|   5|   2|
|   B|2001|   2|   9|   4|
|   B|2001|   2|   4|   3|
|   B|2001|   2|   3|   4|
|   B|2001|   3|  95|   7|
+----+----+----+----+----+

如果col1col2col3 中的对应值相同,我想得到col4 的平均值,然后去掉前3 列中重复值的行.

例如,第一列两个col1col2col3的值是相同的,所以,我们想消除其中一个,更新col4的值作为平均值col4col5。结果应该是:

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|   A|2001|   2| 4.5|   7|
|   A|2001|   3|   6|  10|
|   A|2002|   4|   5|   2|
|   B|2001|   2|5.33|3.67|
|   B|2001|   3|  95|   7|
+----+----+----+----+----+

类似的问题已经被问过,但在 pandas 数据框中。这个问题是在 pyspark 数据框中提出的

【问题讨论】:

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


【解决方案1】:

第一步:创建上述DataFrame -

values = [('A',2001,2,5,6),('A',2001,2,4,8),('A',2001,3,6,10),('A',2002,4,5,2),
          ('B',2001,2,9,4),('B',2001,2,4,3),('B',2001,2,3,4),('B',2001,3,95,7)]
df = sqlContext.createDataFrame(values,['col1','col2','col3','col4','col5'])
df.show()
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|   A|2001|   2|   5|   6|
|   A|2001|   2|   4|   8|
|   A|2001|   3|   6|  10|
|   A|2002|   4|   5|   2|
|   B|2001|   2|   9|   4|
|   B|2001|   2|   4|   3|
|   B|2001|   2|   3|   4|
|   B|2001|   3|  95|   7|
+----+----+----+----+----+

第 2 步:聚合列 col4col5

df = df.groupby(['col1','col2','col3']).agg(avg('col4').alias('col4'),avg('col5').alias('col5'))
df.show()
+----+----+----+-----------------+------------------+
|col1|col2|col3|             col4|              col5|
+----+----+----+-----------------+------------------+
|   A|2001|   3|              6.0|              10.0|
|   A|2002|   4|              5.0|               2.0|
|   B|2001|   2|5.333333333333333|3.6666666666666665|
|   A|2001|   2|              4.5|               7.0|
|   B|2001|   3|             95.0|               7.0|
+----+----+----+-----------------+------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多