sparkSQL重点

1、SparkSQL是干嘛的?为什么会有SparkSQL?

 

对标hive 简化开发 和学习成本

2、SparkSQL底层有什么编程抽象?

DataFrame 和DataSet

 

 

3、hive on spark 和 spark on hive区别?我们学的SparkSQL是什么?

语法不一样 谁负责SQL的解析优化

sparkSQL是 spark on hive  玩的spark 

 

 

 

4、DF、DS、RDD三者之间的区别和联系?

只关心数据 =》 关心数据+数据结构(元数据) =》 关心数据+数据结构+记录一行数据的类型(强类型)  把每行数据当作一个对象

历史 1.0 1.3 1.6

DF是DS的一个特例 DataSet[Row]

 

 

5、DF、DS、RDD三者如何转换?(画图说明)

涉及转换 要有个 隐式转换

 

 

6、SparkSQL中有两种什么语法?简述这两种语法的区别和联系。

SQL风格语法 DSL风格语法 

都是类sql语句 DSL不需要创建临时表

DSL 更 像函数方法的调用 把sql语句给拆分了

------------------------------上机---------------------------

7、SparkSQL中自定义UDAF实现求平均年龄。

关键是buff的属性

自定义 Aggregator 类

继承 3个泛型(in out buff) 6个方法 (初始化+2个序列化)(分区内 分区间 聚合)

  case class buff(var total:Long,var count:Long)
  /*
   自定义聚合函数类:计算年龄的平均值
   1. 继承org.apache.spark.sql.expressions.Aggregator, 定义泛型
       IN : 输入的数据类型 Long
       BUF : 缓冲区的数据类型 Buff
       OUT : 输出的数据类型 double
   2. 重写方法(6)
   */
  class myavg() extends Aggregator[Long,buff,Double]{
    // 初始化缓冲区
    override def zero: buff = {
      buff(0L,0L)
    }

    // 根据输入的数据更新缓冲区的数据
    override def reduce(buff: buff, in: Long): buff = {
      buff.total = buff.total + in
      buff.count = buff.count + 1
      buff
    }
    // 多个缓冲区数据合并
    override def merge(buff1: buff, buff2: buff): buff = {
      buff1.total = buff1.total + buff2.total
      buff1.count = buff1.count + buff2.count
      buff1
    }
    // 完成聚合操作,获取最终结果
    override def finish(buff: buff): Double = {
      buff.total.toDouble / buff.count
    }
    // SparkSQL对传递的对象的序列化操作(编码)
    // 自定义类型就是product   自带类型根据类型选择
    override def bufferEncoder: Encoder[buff] = Encoders.product

    override def outputEncoder: Encoder[Double] = Encoders.scalaDouble
  }

主方法调用

        // 5 注册UDAF

        spark.udf.register("myAvg", functions.udaf(new MyAvgUDAF()))

 

        // 6 调用自定义UDAF函数

        spark.sql("select myAvg(age) from user").show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值