如何在Pyspark中同时执行GroupBy、Having和Order by

jvidinwx  于 2022-11-21  发布在  Spark
关注(0)|答案(1)|浏览(176)

我正在寻找一个解决方案,我正在执行的分组,有子句和排序一起在一个Pyspark代码。基本上,我们需要转移一些数据从一个 Dataframe 到另一个与一些条件。
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'])
dbf7pr2w

dbf7pr2w1#

你的代码基本上没问题,在修复了一些语法问题之后,它就可以工作了。另外,我认为对于“attendence”,你应该使用sum而不是count(否则它将总是与name count相同的值)。对于排序,只需添加orderBy

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

相关问题