Spark-SQL核心编程2

路径问题

相对路径与绝对路径:建议使用绝对路径,避免复制粘贴导致的错误,必要时将斜杠改为双反斜杠。

数据处理与展示

SQL 风格语法:创建临时视图并使用 SQL 风格语法查询数据。

DSL 风格语法 :使用 DSL 风格语法查询 user 表中的 user nameage 列。

http://【Spark-SQL核心编程 - CSDN App】https://blog.csdn.net/2401_84627304/article/details/147227309?sharetype=blog&shareId=147227309&sharerefer=APP&sharesource=2401_84627304&sharefrom=link

(我的博客文章 ++spark-SQL核心编程++ 目录中能找到 )

利用IDEA开发Spark-SQL

导入的包

下面的代码 (

复制代码
val df : DataFrame后面的地址是自己放的文档的地址

运行结果:

自定义函数:

UDF

UDAF(自定义聚合函数)

强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数, 如 count(),countDistinct(),avg(),max(),min()。除此之外,用户可以设定自己的自定义聚合函数。Spark3.0之前我们使用的是UserDefinedAggregateFunction作为自定义聚合函数,从 Spark3.0 版本后可以统一采用强类型聚合函数 Aggregator

实验需求:计算平均工资

实现方式一:RDD

RDD 实现:通过 RDD 进行薪资数据的映射和聚合,计算平均工资。

case (name, salary) => {
(salary, 1)
}

这个代码是为了弱化没有关系的东西,比如这个平均薪资中名字不重要

实现方式二:弱类型 UDAF 实现

通过创建类和函数,封装并调用自定义聚合函数,计算平均工资。

复制代码
classMyAverageUDAF extendsUserDefinedAggregateFunction{

  definputSchema: StructType =

    StructType(Array(StructField("salary",IntegerType)))

  //聚合函数缓冲区中值的数据类型(salary,count)defbufferSchema: StructType = {



    StructType(Array(StructField("sum",LongType),StructField("count",LongType)))

  }

  //函数返回值的数据类型defdataType: DataType = DoubleType

  //稳定性:对于相同的输入是否一直返回相同的输出。defdeterministic: Boolean = true//函数缓冲区初始化definitialize(buffer: MutableAggregationBuffer): Unit = {

    //存薪资的总和buffer(0) = 0L

    //存薪资的个数buffer(1) = 0L

  }

  //更新缓冲区中的数据defupdate(buffer: MutableAggregationBuffer,input: Row): Unit = {

    if(!input.isNullAt(0)) {

      buffer(0) = buffer.getLong(0) + input.getInt(0)

      buffer(1) = buffer.getLong(1) + 1

    }

  }

  //合并缓冲区defmerge(buffer1: MutableAggregationBuffer,buffer2: Row): Unit = {

    buffer1(0) = buffer1.getLong(0) + buffer2.getLong(0)

    buffer1(1) = buffer1.getLong(1) + buffer2.getLong(1)

  }

  //计算最终结果defevaluate(buffer: Row): Double = buffer.getLong(0).toDouble /

    buffer.getLong(1)

}
复制代码
valsparkconf: SparkConf = newSparkConf().setAppName("app").setMaster("local\[\*\]")

valspark:SparkSession = SparkSession.builder().config(conf).getOrCreate()



importspark.implicits._

valres :RDD[(String,Int)]= spark.sparkContext.makeRDD(List(("zhangsan", 20), ("lisi", 30), ("wangwu",40)))



valdf :DataFrame = res.toDF("name","salary")

df.createOrReplaceTempView("user")

varmyAverage = newMyAverageUDAF

//在spark中注册聚合函数spark.udf.register("avgSalary",myAverage)

spark.sql("select avgSalary(salary) from user").show()



//关闭连接spark.stop()

注意:

第一行带下划线的如果运用代码出现删除线,这个能用,只是提醒你有别的最新的法

实现方式三:强类型UDAF

相关推荐
WLJT1231231237 分钟前
生活电器:重构家居体验的产业变革与发展探索
大数据·人工智能·科技·生活
GIS数据转换器1 小时前
城市基础设施安全运行监管平台
大数据·运维·人工智能·物联网·安全·无人机·1024程序员节
老葱头蒸鸡1 小时前
(3)Kafka生产者分区策略、ISR、ACK、一致性语义
分布式·kafka
搞科研的小刘选手1 小时前
【云计算专题会议】第二届云计算与大数据国际学术会议(ICCBD 2025)
大数据·人工智能·物联网·5g·云计算·6g·智能通信
电商软件开发 小银1 小时前
微信生态新机遇:视频号推客模式助力商家突围
大数据·人工智能·twitter·系统开发·实体店转型·数字化经济·视频号推客模式
毕设源码-赖学姐2 小时前
【开题答辩全过程】以基于Hadoop的电商数据分析系统为例,包含答辩的问题和答案
大数据·hadoop·分布式·1024程序员节
汤姆yu2 小时前
基于python大数据技术的医疗数据分析与研究
大数据·1024程序员节·医疗数据分析·医疗预测
ink@re3 小时前
消息队列集群——RabbitMQ
分布式·rabbitmq·1024程序员节
小马哥编程3 小时前
【软考架构】架构风格:RAG知识库是属于软件八大架构风格中的哪一个,黑板架构风格 ?规则系统体系风格?
大数据·计算机网络·架构·1024程序员节
萤丰信息3 小时前
慧园区:科技赋能下的城市空间新范式
大数据·科技·安全·重构·智慧城市·智慧园区