Spark SQL内置函数的使用Spark SQL执行计划总结

来源:互联网 发布:excel 数组 排名 编辑:程序博客网 时间:2024/05/06 16:56

个人感觉Spark SQL的优势在于UDF和DataFrame(RDD的封装,由于RDD是可以是任意类型,因此可以封装一个对象在RDD里面,spark2.0以后对DataSet做了优化,由于DataFrame是弱类型的判断,DataSet是静态类型的在数据的优化和性能上应该有更大的提升)

本文的操作spark 1.6.1

内置函数 需要倒入 importorg.apache.spark.sql.functions._

max、mean、min、sum、avg、explode、size、sort_array、day、to_date、abs、acros、asin、atan
总体上而言内置函数包含了五大基本类型:
1、聚合函数,例如countDistinct、sumDistinct等;
2、集合函数,例如sort_array、explode等
3、日期、时间函数,例如hour、quarter、next_day
4、数学函数,例如asin、atan、sqrt、tan、round等;
5、开窗函数,例如rowNumber等
6、字符串函数,concat、format_number、rexexp_extract
7、其它函数,isNaN、sha、randn、callUDF

SparkContext核心作用:初始化Spark应用程序运行所需要的核心组件,包括DAGScheduler、TaskScheduler、SchedulerBackend
同时还会负责Spark程序往Master注册程序等

hive支持的一些函数比如collect_set,collect_list必须使用Hivecontext,HiveContext是对SQLcontext的一个扩展,但在Spark2.0以后好像都整合到SparkSession里面去了,确实不用在做重复的工作

val conf = new SparkConf().setAppName("BrandIndustryTest品牌行业").setMaster("local[*]")val sc = new SparkContext(conf)implicit val sqlcontext = new HiveContext(sc)
//对应的隐式转换,要有到Spark SQL下的一些函数
import sqlcontext.implicits._
val df = Seq((1, "101", "2001"), (1, "102", "2002"), (2, "202", "2003"), (2, "302", "2004")).toDF("id", "local", "num")  .selectExpr("id", "concat_ws('_',local,num) loc_nm")df.show()val rs = df.groupBy($"id").agg(concat_ws("|", collect_set($"loc_nm")).as("locNm"))
运用到的内置函数为:concat_ws
结果:
+---+-----------------+
| id|            locNm|
+---+-----------------+
|  1|101_2001|102_2002|
|  2|202_2003|302_2004|
+---+-----------------+

 explode Creates a new row for each element in the given array or map column.这个内置函数是把DataType为array的分裂开来
 collect_list 结合groupby使用,组成一个list,其中collect_set,collect_list的区别为set去重,list不去重


优雅的运用case when 

val testDF = Seq(("1", "USA", List("Apple,Orage")), ("2", "China", List("Apple,Brand,Orage"))).toDF("id", "country", "hobbits")
//动态实现
testDF.selectExpr("explode(hobbits) hobbit", "hobbits", "id", "case when country='USA' then '美国' when country='China' then '中国' else '无' end country").show()
//静态实现testDF.select(when($"country" === lit("USA"), "美国").when($"country" === lit("China"), "中国").otherwise(lit("无")).as("country")).show()
+-----------------+-------------------+---+-------+|           hobbit|            hobbits| id|country|+-----------------+-------------------+---+-------+|      Apple,Orage|      [Apple,Orage]|  1|     美国||Apple,Brand,Orage|[Apple,Brand,Orage]|  2|     中国|+-----------------+-------------------+---+-------+

Spark SQL执行计划:

基于spark1.6

sqlcontext.sql("")

返回一个DataFrame
/** * Executes a SQL query using Spark, returning the result as a [[DataFrame]]. The dialect that is * used for SQL parsing can be configured with 'spark.sql.dialect'. * * @group basic * @since 1.3.0 */def sql(sqlText: String): DataFrame = {  DataFrame(this, parseSql(sqlText))}
//生成LogicPlan
protected[sql] def parseSql(sql: String): LogicalPlan = ddlParser.parse(sql, false)

class DDLParser(parseQuery: String => LogicalPlan)  extends AbstractSparkSQLParser with DataTypeParser with Logging {  def parse(input: String, exceptionOnError: Boolean): LogicalPlan = {    try {      parse(input)    } catch {      case ddlException: DDLException => throw ddlException      case _ if !exceptionOnError => parseQuery(input)      case x: Throwable => throw x    }  }





0 0
原创粉丝点击