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两种通用方式实现及比较