【问题标题】:Spark dataframe filter vs Hive where clauseSpark 数据框过滤器与 Hive where 子句
【发布时间】:2020-12-17 06:12:22
【问题描述】:

我只是想知道这个火花代码是否

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

和这个一样高效:

val df = spark.sql("select * from db.table where field=value")

在第一个块中,我们是将所有 hive 数据加载到 RAM 还是 spark 足够智能以在生成的 DAG 执行期间过滤 hive 中的这些值

提前致谢!

【问题讨论】:

  • 最好为这两种方法获取查询计划。使用 .explain()。但我猜两者都有相同的执行计划。请检查是否如此。
  • 它给出了不同的解析逻辑计划,第二个更优化,但最终优化的逻辑计划与 2 相同,谢谢@AbhishekSengupta,我不知道这个解释函数
  • 欢迎,总是寻找最终的逻辑计划,Spark 中的优化器其实很聪明。还可以尝试使用 Spark UI 检查 DAG 以获取更多信息,通常在 localhost:4040 可用。确保最后不要关闭 Session,否则您将无法检查 UI。

标签: dataframe apache-spark hive apache-spark-sql


【解决方案1】:

无论我们通过 DataFrame 函数或 Spark SQL 对数据帧或其视图应用过滤器,它们都将产生相同的物理计划(这是一个计划,根据该计划实际跨集群执行 spark 作业)。

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

您也可以看看这个databricks link 更清楚地了解它。此外,我们可以使用.explain 函数检查此物理计划(注意.explain 的输出应与常规方式相反,因为它的最后一行表示物理计划的开始,第一行表示物理计划的结束。)

【讨论】:

    【解决方案2】:

    你不使用相同的功能,但内部是相同的。

    您可以使用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

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多