sparksql两种方式的执行效率

Posted ZH519080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 算子的执行效率要高???

以上是关于sparksql两种方式的执行效率的主要内容,如果未能解决你的问题,请参考以下文章

spark利用sparkSQL将数据写入hive两种通用方式实现及比较

spark利用sparkSQL将数据写入hive两种通用方式实现及比较

sparksql两种解决方式

Spark SQL 浅学笔记2

Spark SQL 浅学笔记2

「Spark」Spark SQL Thrift Server运行方式