sparksql.sql.codegen没有给出任何改进

时间:2016-05-08 18:06:47

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

我正在执行spark sql中的查询,如下所示。表的数据存储在hive表中的2个不同节点中。

但是因为查询有点慢我试着在spark中找到一些选项,所以查询可以更快地执行。所以我发现我们可以将sparksql.sql.codegenspark.sql.inMemoryColumnarStorage.compressed配置为true而不是默认的false。

但是我没有任何改进,这两个选项的查询是真的需要4,1分钟才能执行。这个选项是假的也是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 个答案:

答案 0 :(得分:1)

    火花2.0默认启用
  • spark.sql.codegen.wholeStage。并且它将从火花催化剂方面进行所有内部优化

  • spark.sql.codegen(Spark 1.3+中的功能)默认为false。即使您这样做,也可以与DF.explain / debug

  • 进行交叉核对

然而,请。重新访问下面火花2+中解释的方法。

如果你使用较低版本的spark,即1.3或1.4+,则相同的DataFrame方法是有效的,除非我们必须使用hiveContext。

  • 根据我的经验,上述查询的数据集[Row]又称DataFrame方法比简单的配置单元查询快一点。

请尝试以下伪代码。

创建一个数据框,没有任何聚合,组,顺序如下。

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import spark.implicits._
import spark.sql


// warehouseLocation points to the default location for managed databases and tables
val warehouseLocation = "file:${system:user.dir}/spark-warehouse"

val spark = SparkSession
  .builder()
  .appName("Spark Hive Aggregations")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()


val df : DataFrame = sql(("""select l_returnflag, l_linestatus,l_quantity,l_extendedprice,l_quantity ,l_extendedprice,l_quantity, l_extendedprice, l_discount from
        lineitem where l_shipdate <= '1998-09-16""");

// can use spark udf or when(cond, evaluation), instead of direct expression
 val df1 =  df.withColumn("sum_disc_price", df.col("l_extendedprice") * (1 - df.col("l_discount"))
          .withColumn("sum_charge", df.col("l_extendedprice") * (1 + df.col("l_tax"))

//NOW SUM, AVG and group by  on dataframe
val groupeddf = df1.groupBy(
  df1.col("returnflag")
, df1.col("l_linestatus")
.agg(
      avg(df1.col("l_quantity")),
    , avg(df1.col("l_extendedprice"))
    , avg(df1.col("l_discount"))
    , sum(df1.col("l_quantity"))
    , sum(df1.col("l_extendedprice"))
    , sum(df1.col("sum_disc_price"))
    , sum(df1.col("sum_charge"))
    , count(df1.col("l_linestatus").as("cnt")
    ) //end agg
    ) //end group by 
//order by on dataframe  
.orderBy("l_returnflag"))
.sort("l_linestatus")
val finalDF = groupeddf.select("l_returnflag","l_linestatus",............. etc);
  • 此外,还需要考虑执行程序内存,执行程序/核心数等参数才能找到确切的问题