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

Apache spark 将SQL查询转换为Spark Dataframe结构化数据处理,apache-spark,hadoop,apache-spark-sql,bigdata,Apache Spark,Hadoop,Apache Spark Sql,Bigdata,我想在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 输出: +---------+---+

我想在
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|
+---------+-----+  

我知道这个
是不正确的
,因为假设我们的部门只有一个条目,那么它也会列在这些结果中,但我希望只有当
计数大于2时才显示结果。那么我怎样才能做到这一点呢???我尝试过谷歌搜索,但在这种情况下没有任何帮助。

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

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

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

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

尝试以下方法:

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

试着这样做:

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

简单而甜蜜!简单而甜蜜!工作起来很有魅力。但我必须在计数之前删除函数。它的意义是什么that@Debuggerr这是正常的,count是
functions
包中的一个函数。它包括许多用于处理数据帧的内置函数,count是groupBy之后应用的函数之一。你真的应该看看它们:@调试工具也请考虑接受/投票的答案,如果它的工作和帮助你,但当我尝试执行你的代码,它会引发一个错误,无法找到功能。我正在开发spark的1.6版本。因此,我是否需要显式导入它以使其工作???@Debuggerr for pyspark use
from pyspark.sql.functions import*
,对于Scala/Java,我始终使用函数,但您可以使用等效的
import org.apache.spark.sql.functions就像一个符咒。但我必须在计数之前删除函数。它的意义是什么that@Debuggerr这是正常的,count是
functions
包中的一个函数。它包括许多用于处理数据帧的内置函数,count是groupBy之后应用的函数之一。你真的应该看看它们:@调试工具也请考虑接受/投票的答案,如果它的工作和帮助你,但当我尝试执行你的代码,它会引发一个错误,无法找到功能。我正在开发spark的1.6版本。因此,我是否需要显式导入它以使其工作???@Debuggerr for pyspark use
from pyspark.sql.functions import*
,对于Scala/Java,我始终使用函数,但您可以使用等效的
import org.apache.spark.sql.functions查询和数据帧操作之间没有性能差异,那么为什么需要这样做呢?我只是从certification perspective@cricket_007;学习查询和数据帧操作之间没有性能差异,那你为什么要这么做呢?我只是从认证的角度来学习@cricket_007