Dataframe Spark数据帧筛选器vs配置单元where子句

Dataframe Spark数据帧筛选器vs配置单元where子句,dataframe,apache-spark,hive,apache-spark-sql,Dataframe,Apache Spark,Hive,Apache Spark Sql,我只是想知道这个火花码 val df = spark.sql("select * from db.table").filter(col("field")=value) 和这个一样有效: val df = spark.sql("select * from db.table where field=value") 在第一组中,我们是将所有配置单元数据加载到RAM中,还是spark足够聪明,能够在执行生成的DAG期间过滤配置单元中的那些值

我只是想知道这个火花码

val df = spark.sql("select * from db.table").filter(col("field")=value)
和这个一样有效:

val df = spark.sql("select * from db.table where field=value")
在第一组中,我们是将所有配置单元数据加载到RAM中,还是spark足够聪明,能够在执行生成的DAG期间过滤配置单元中的那些值


提前谢谢

你不用相同的函数,但本质上是一样的

您可以使用
explain()
检查逻辑计划:

spark.sql("select * from db.table").filter(col("field")=value).explain()

spark.sql("select * from db.table where field=value").explain()
在第一种情况下,您使用spark SQL和Dataset api之间的混合,并使用
.filter(col(“field”)=value)


在第二种情况下,您是纯sql,您不使用相同的函数,但在内部它是相同的

您可以使用
explain()
检查逻辑计划:

spark.sql("select * from db.table").filter(col("field")=value).explain()

spark.sql("select * from db.table where field=value").explain()
在第一种情况下,您使用spark SQL和Dataset api之间的混合,并使用
.filter(col(“field”)=value)


在第二种情况下,您是纯sql的

无论我们对数据帧或其视图应用filter-through-DataFrame函数还是Spark sql,它们都将产生相同的物理计划(这是一个计划,根据该计划,Spark作业实际上在集群中执行)

这背后的原因是Apache Spark的Catalyst Optimizer。它是Spark的内置功能,可将输入SQL查询或数据帧转换转换为逻辑和成本优化的物理计划


你也可以看一看,更清楚地理解它。此外,我们可以使用
.explain
功能检查此物理计划(小心
。explain
的输出应以与常规相反的方式读取,因为它的最后一行表示物理计划的开始,第一行表示物理计划的结束。)

无论我们对数据帧或其视图应用filter-through-DataFrame函数还是Spark SQL,它们都将产生相同的物理计划(这是一个计划,根据该计划,Spark作业实际上在集群中执行)

这背后的原因是Apache Spark的Catalyst Optimizer。它是Spark的内置功能,可将输入SQL查询或数据帧转换转换为逻辑和成本优化的物理计划


你也可以看一看,更清楚地理解它。此外,我们可以使用
.explain
功能检查此物理计划(小心
。explain
的输出应以与常规相反的方式读取,因为它的最后一行表示物理计划的开始,第一行表示物理计划的结束。)

最好同时获得这两种方法的查询计划。使用.explain()。但我想两者都有相同的执行计划。请检查是否如此。它给出了不同的解析逻辑计划第二个更优化,但最终优化的逻辑计划与第二个相同,谢谢@AbhishekSengupta,我不知道这个解释函数欢迎,总是寻找最终的逻辑计划,Spark中的优化器实际上非常智能。还可以尝试使用Spark UI检查DAG以获取更多信息,Spark UI通常在localhost:4040上提供。确保你没有在结束时关闭会话,否则你将无法检查UI。最好获得这两种方法的查询计划。使用.explain()。但我想两者都有相同的执行计划。请检查是否如此。它给出了不同的解析逻辑计划第二个更优化,但最终优化的逻辑计划与第二个相同,谢谢@AbhishekSengupta,我不知道这个解释函数欢迎,总是寻找最终的逻辑计划,Spark中的优化器实际上非常智能。还可以尝试使用Spark UI检查DAG以获取更多信息,Spark UI通常在localhost:4040上提供。确保最后没有关闭会话,否则将无法检查UI。