将sql查询转换为spark dataframe结构化数据处理

kupeojn6  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(473)

我想 convert 下面的 queryspark dataframe :

sqlContext.sql("SELECT d.dep_name,count(*) FROM employees e,department d WHERE e.dep_id = d.dep_id GROUP BY d.dep_name HAVING count(*) >= 2").show

输出:

+---------+---+                                                                 
| dep_name|_c1|
+---------+---+
|  FINANCE|  3|
|    AUDIT|  5|
|MARKETING|  6|

我用下面的查询进行了尝试:

scala> finalEmployeesDf.as("df1").join(depDf.as("df2"), $"df1.dep_id" === $"df2.dep_id").select($"dep_name").groupBy($"dep_name").count.show()
+---------+-----+                                                               
| dep_name|count|
+---------+-----+
|  FINANCE|    3|
|    AUDIT|    5|
|MARKETING|    6|
+---------+-----+

我知道这个 isn't correct 因为假设我们有一个情况,我们只有一个部门的条目,那么它也将列在这些结果,但我想结果显示只有当 counts are greater than 2 . 那我怎么才能做到呢???我试过用谷歌搜索,但对这个案子毫无帮助。

n3schb8v

n3schb8v1#

组和聚合部分错误。您需要选择所有相关列、分组依据和聚合依据。以下是未经测试的代码,将代表正确的方法:

finalEmployeesDf.as("df1")
 .join(depDf.as("df2"), $"df1.dep_id" === $"df2.dep_id")
 .select($"dep_name")
 .groupBy($"dep_name")
 .agg(count($"dep_name").as("cnt"))
 .filter($"cnt" > 2)
 .show()

一般的建议是尝试将api调用分成几行,这使得阅读和理解更加容易。

5q4ezhmt

5q4ezhmt2#

尝试以下操作:

DF.groupBy("x").agg(count("*").alias("cnt")).where($"cnt" > 2)

相关问题