如何在Spark SQL中启用Catalyst Query Optimiser?

时间:2016-06-13 15:22:54

标签: apache-spark query-optimization apache-spark-sql

无论是直接使用Spark-SQL还是使用Spark-Shell,我都不知道以明确的方式检查Spark Catalyst查询优化器的操作。

例如,我们假设我按如下方式制作了HiveContext:

val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)

然后,当我尝试将查询处理为:

hiveContext.sql("""
        | SELECT dt.d_year, item.i_brand_id brand_id, item.i_brand brand,SUM(ss_ext_sales_price) sum_agg
        | FROM  date_dim dt, store_sales, item
        | WHERE dt.d_date_sk = store_sales.ss_sold_date_sk
        |   AND store_sales.ss_item_sk = item.i_item_sk
        |   AND item.i_manufact_id = 128
        |   AND dt.d_moy=11
        | GROUP BY dt.d_year, item.i_brand, item.i_brand_id
        | ORDER BY dt.d_year, sum_agg desc, brand_id
        | LIMIT 100
        """).collect().foreach(println)

有没有办法检查催化剂优化器的存在? 如果不存在,那么我们如何为HiveContext启用催化剂优化器?

1 个答案:

答案 0 :(得分:2)

始终在Spark 2.0中启用Catalyst Query Optimizer 。当您使用Spark 2.0&{39} Datasets时,这是您获得免费的优化的一部分(这是您应该使用的众多原因之一{{1}在使用Datasets)进入低级别之前。

如果您希望查看应用于查询的优化Catalyst查询优化程序,请在RDDs中使用TRACE日志记录级别的SparkOptimizer:

conf/log4j.properties

每当您触发执行查询时(通过log4j.logger.org.apache.spark.sql.execution.SparkOptimizer=TRACE show或仅仅collect),您将看到大量日志与Catalyst Query Optimizer的工作是每次执行查询时都会为您做好准备。

让我们看看Column Pruning optimization rule的实际效果。

explain