【问题标题】:How to Perform GroupBy , Having and Order by together in Pyspark如何在 Pyspark 中同时执行 GroupBy、Having 和 Order by
【发布时间】:2022-11-17 16:09:08
【问题描述】:

我正在寻找一种解决方案,我在 Pyspark 代码中一起执行 GROUP BY、HAVING CLAUSE 和 ORDER BY。基本上我们需要在某些条件下将一些数据从一个数据帧转移到另一个数据帧。

SQL 查询看起来像这样,我正在尝试将其更改为 Pyspark

SELECT TABLE1.NAME, Count(TABLE1.NAME) AS COUNTOFNAME, 
Count(TABLE1.ATTENDANCE) AS COUNTOFATTENDANCE INTO SCHOOL_DATA_TABLE
FROM TABLE1
WHERE (((TABLE1.NAME) Is Not Null))
GROUP BY TABLE1.NAME
HAVING (((Count(TABLE1.NAME))>1) AND ((Count(TABLE1.ATTENDANCE))<>5))
ORDER BY Count(TABLE1.NAME) DESC;

我尝试过但失败的 Spark 代码是: 我做了什么我已经采取了从 df 到 df2 的列,需要完成哪些操作:

df2= df.select('NAME','ATTENDANCE')
    df2=df2.groupBy('NAME').agg(count('NAME').alias('name1').agg(count('ATTENDANCE').alias('NEW_ATTENDANCE'))).filter((col('name1')>1) & (col('NEW_ATTENDANCE') !=5))

样本数据

rdd = spark.sparkContext.parallelize([
    ('Aayush', 10),
    ('Aayush', 9),
    ('Shiva', 5 ),
    ('Alia', 6),
    ('Aayan', 11),
    ('Alia',9)])
df_1 = spark.createDataFrame(rdd, schema=['NAME','ATTENDANCE'])

【问题讨论】:

  • agg 可以进行多次聚合。尝试像这样传递 2 个计数agg(count().alias(), count().alias())
  • 基于@Emma 提供的答案,df2= df_1.select('NAME','ATTENDANCE') df2 = df2.groupBy('NAME').agg(count('NAME').alias('name1'),count('ATTENDANCE').alias('NEW_ATTENDANCE')).filter("name1 &gt; 1 and NEW_ATTENDANCE !=5") df2.show(10,True)

标签: python dataframe apache-spark pyspark databricks


【解决方案1】:

您的代码几乎没问题,在修复了一些语法问题后它就可以工作了。 此外,我认为对于“出勤”你想使用sum而不是count(否则它将始终与名称计数相同的值)。 如需排序,只需添加orderBy

df.groupBy('NAME')
.agg(count('NAME').alias('name1'),sum('ATTENDANCE').alias('NEW_ATTENDANCE'))
.filter((col('name1')>1) & (col('NEW_ATTENDANCE') !=5))
.orderBy(col("NAME"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2014-01-30
    • 2013-10-06
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多