【发布时间】: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 > 1 and NEW_ATTENDANCE !=5") df2.show(10,True)
标签: python dataframe apache-spark pyspark databricks