Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark sparksql.sql.codegen没有提供任何改进_Apache Spark_Hive_Apache Spark Sql - Fatal编程技术网

Apache spark sparksql.sql.codegen没有提供任何改进

Apache spark sparksql.sql.codegen没有提供任何改进,apache-spark,hive,apache-spark-sql,Apache Spark,Hive,Apache Spark Sql,我正在spark sql中执行一个查询,如下所示。表的数据存储在配置单元表中的两个不同节点中 但由于查询速度有点慢,我尝试在spark中找到一些选项,以便查询执行得更快。因此,我发现我们可以将sparksql.sql.codegen和spark.sql.inMemoryColumnarStorage.compressed配置为true,而不是默认的false 但是我没有任何改进,在true中使用这两个选项的查询需要4,1分钟来执行。如果此选项为false,则也需要4.1分钟 你明白为什么这个选项

我正在spark sql中执行一个查询,如下所示。表的数据存储在配置单元表中的两个不同节点中

但由于查询速度有点慢,我尝试在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();
query=hiveContext.sql(““”选择
l_returnflag,
l_linestatus,
总和(l_数量)作为总和数量,
总和(l_扩展价格)作为总和基价,
总额(l_扩展价格*(1-l_折扣))作为总额价格,
金额(l_扩展价格*(1-l_折扣)*(1+l_税))作为总额费用,
平均数量(l_数量)作为平均数量,
平均价格(l_扩展价格)作为平均价格,
平均折扣(l_折扣)作为平均折扣盘,
按计数顺序计数(*)
从…起
行项目
哪里
l_发货日期
  • 默认情况下,spark 2.0启用了spark.sql.codegen.whisttage
。它将从spark catalist端执行所有可能的内部优化。
  • spark.sql.codegen
    (spark 1.3+中的功能)默认为
    false
    。即使设置为true,也可以使用
    DF.explain/debug
  • 但是,请重新访问spark 2+中解释的方法,如下所示

    如果您使用的是spark的较低版本,即1.3或1.4+,则相同的数据帧方法有效,但我们必须与hiveContext一起使用


    • 根据我的经验,上述查询的Dataset[Row]又名DataFrame方法比普通的hive查询快一点。
    请尝试下面的伪代码

    创建一个没有任何聚合、分组和排序依据的数据帧,如下所示

    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);
    
    import org.apache.spark.sql.SparkSession
    导入org.apache.spark.sql.functions_
    导入spark.implicits_
    导入spark.sql
    //warehouseLocation指向托管数据库和表的默认位置
    val warehouseLocation=“文件:${system:user.dir}/spark warehouse”
    val spark=火花会话
    .builder()
    .appName(“Spark Hive聚合”)
    .config(“spark.sql.warehouse.dir”,warehouseLocation)
    .enableHiveSupport()
    .getOrCreate()
    val df:DataFrame=sql(“”“选择l_returnflag,l_linestatus,l_数量,l_extendedprice,l_数量,l_extendedprice,l_数量,l_extendedprice,l_折扣自
    请查看l_shipdate所在的行项目,了解
    sparksql.sql.codegen
    的工作原理