无论是直接使用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启用催化剂优化器?
答案 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