sparksql两种方式的执行效率

方式一:

  /**使用spark-sql实现的*/
  def rhVisitor(ss: SparkSession,dt: String,per_hour: String,merchant: String): Unit ={

    val startTime = System.currentTimeMillis()
    import org.apache.spark.sql.functions._
    val sql = "SELECT visitor_cookie FROM clickstream_flow"
    val rhresult = ss.sql(sql)
      .where(s"dt = '$dt'")
      .where(s"hour = '$per_hour'")
      .where(s"merchant = '$merchant'")
      .filter("visitor_cookie is not null")
      .filter("page_type_name not in ('Other','LoginPage','LoginAction')")
      .filter("http_resp_code = '200' or page_type_name = 'Shoppingcart'")
      .groupBy("visitor_cookie")
      /**聚合计算,并重命名为pv*/
      .agg(count("visitor_cookie") as("pv"))
      /**withColumnRenamed对字段重命名*/
      .withColumnRenamed("visitor_cookie","visitor")
      /**添加新字段,并对此字段进行赋值*/
      .withColumn("dt",lit(s"$dt"))
        .withColumn("hour",lit(s"$per_hour"))
        .withColumn("merchant",lit(s"$merchant"))
      .coalesce(2)

    println("。。。。。。 开始存入hive分区表中 。。。。。。")
    /**把结果存入hive分区表中*/
    rhresult.write.mode(SaveMode.Overwrite).format("hive").insertInto("table_name_copy")
    val endTime = System.currentTimeMillis()
    println("程序运行时间: "+(endTime - startTime)/1000.0+"s")
  }

此方式的大概执行时间为25s左右。

方式二:

    /**使用hive语句,但是计算引擎依然使用spark实现*/
  def rhBounceVisitorHql(ss: SparkSession,dt: String,per_hour: String,merchant: String): Unit ={
    val startTime = System.currentTimeMillis()
    import org.apache.spark.sql.functions._
    var hql = s"SELECT visitor_cookie,COUNT(1) AS pv FROM clickstream_flow WHERE dt = '$dt' AND hour = '$per_hour' AND merchant = '$merchant' AND visitor_cookie IS NOT NULL AND page_type_name NOT IN('Other','LoginPage','LoginAction') AND (http_resp_code = '200' OR page_type_name = 'Shoppingcart') GROUP BY visitor_cookie"
    val result: DataFrame = ss.sql(hql)
      .withColumn("dt",lit(s"$dt"))
      .withColumn("hour",lit(s"$per_hour"))
      .withColumn("merchant",lit(s"$merchant"))
      .coalesce(2)
    result.write.mode(SaveMode.Overwrite).format("hive").insertInto("table_name_copy")
    val endTime = System.currentTimeMillis()
    println("hql程序运行时间: "+(endTime - startTime)/1000.0+"s")
  }

此方式的大概运行时间为10s左右。

以上两种方式的运行时间不同,也就是直接hive-spark要比spark sql 算子的执行效率要高???

你可能感兴趣的:(spark)