我正在sparksql中执行一个查询,如下所示。表的数据存储在配置单元表中的两个不同节点中。
但是因为查询有点慢,我尝试在spark中找到一些选项,这样查询可以执行得更快。所以我发现我们可以配置 sparksql.sql.codegen
以及 spark.sql.inMemoryColumnarStorage.compressed
设置为true而不是默认的false。
但我没有任何改进,在true中使用这两个选项的查询需要4,1分钟才能执行。如果选择false,也需要4,1分钟。
你明白为什么这个选项不起作用吗?
query = hiveContext.sql("""select
l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
l_shipdate <= '1998-09-16'
group by
l_returnflag,
l_linestatus
order by
l_returnflag,
l_linestatus""");
query.collect();
1条答案
按热度按时间h9a6wy2h1#
对于spark 2.0,默认情况下启用spark.sql.codegen.whitestage。它将做所有的内部优化可能从Spark催化剂方面。
spark.sql.codegen(这是spark 1.3+中的特性)默认为false。即使设置为true,也可以使用df.explain/debug进行交叉检查
但是,请。重新访问spark 2+中解释的方法,如下所示。
如果您使用的是spark的较低版本,即1.3或1.4+,则相同的Dataframe方法是有效的,除非我们必须与hivecontext一起使用。
根据我的经验,上述查询的dataset[row]aka dataframe方法比普通的hive查询快一些。
请尝试下面的伪代码。
创建一个不包含任何聚合、分组、排序依据的Dataframe。
此外,还需要考虑执行器内存、执行器/核心数等参数,以找到确切的问题