将SQL查询转换为Spark Dataframe结构化数据处理

时间:2018-08-19 06:45:56

标签: apache-spark hadoop apache-spark-sql bigdata

我想在convertquery的下面的spark 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时才显示结果。那么我该如何实现呢?我尝试使用谷歌搜索,但在这种情况下没有帮助。

2 个答案:

答案 0 :(得分:1)

您有错误的分组和集合部分。您需要选择所有相关列,并按相关项分组和汇总一次。这是未经测试的代码,它将代表正确的方法:

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调用分成几行,这使阅读和理解很多更加容易。

答案 1 :(得分:1)

尝试这样的事情:

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