目录
01:上篇回顾
https://blog.youkuaiyun.com/m0_57498038/article/details/119112063
-
RDD、DF、DS之间的区别是什么?
-
RDD:分布式数据集合:数据 + 支持泛型
-
DataFrame:分布式数据表:数据 + Schema + 不支持泛型【Row】
-
DataSet:分布式数据表:数据 + Schema + 支持泛型
-
-
怎么实现三者之间的互相转换?
-
DF 、 DS =》 RDD:.rdd
-
RDD =》 DF、DS
-
方式一:反射:将没有Schema的RDD类型转换有Schema的RDD类型
-
RDD【String】 =》 RDD【CaseClass】
-
-
方式二:自定义Schema
-
RDD【Row】 + Schema【StructType【StructFields】】 = DataFrame
-
-
-
DF => DS :df.as【CaseClass】
-
DS => DF:toDF(colName)
-
-
SaveMode是什么?
-
保存模式
-
Append:追加
-
Overwrite:覆盖
-
ErrorIfExists:默认,如果存在就报错
-
Ignore:如果存在就忽略
-
-
csv:文本文件
-
jdbc:问题:主键 + 约束导致如果用追加:主键重复,如果用覆盖,数据丢失
ds.write.mode.option.jdbc
-
解决
-
如果用官方的JDBC:1-建MySQL表时,允许主键自动更新 2-使用追加模式
-
如果不用官方的JDBC:自己写
ds.foreachPartition(part => { //JDBC //replace into })
-
-
-
-
如何调整SparkSQL 的聚合Shuffle中的分区个数?
-
默认分区:200个
-
修改属性:spark.sql.shuffle.partitions
-
-
SparkSQL有哪些常用的数据源接口?
-
Source接口
-
调用:spark.read.format(“格式”).load(“路径”)
spark.read.csv/partquet/orc/json/jdbc/table
-
02:课程目标
-
SparkSQL与Hive集成
-
SparkSQL为什么要访问Hive,集成基本原理?
-
Spark SQL 集成 Hive 与 Hive on Spark 有什么区别?
-
SparkSQL集成Hive怎么进行开发?
-
-
SparkSQL开发方式
-
IDEA + JAR
-
Shell
-
Beeline
-
SQL脚本
-
JDBC
-
-
SparkStreaming入门
-
实时计算的需求以及场景?
-
SparkStreaming的基本设计:驱动接口【StreamingContext】和数据抽象【DStream】
-
自定义开发一个SparkStreaming程序:Wordcount
-
03:数据源Sink:设计
-
目标:了解SparkSQL中Sink数据源的设计
-
实施
-
设计:非常类似于MR的设计
-
MR的设计
-
输出:OutputFormat
-
TextOutputFormat:将结果保存为文件
-
DBOutputFormat:将结果保存到MySQL
-
-
-
SparkSQL的设计
-
输出:DataFrameWriter
-
.csv
-
.jdbc
-
.parquet
-
.json
-
……
-
-
-
-
语法
//保存方式一:redis、hbase、JDBC df/ds.foreachPartition(自定义保存的逻辑) //保存方式二 df/ds.write.mode.jdbc => df/ds.write.mode.format("输出的格式").save("路径") //保存方式三 df/ds .write .mode(SaveMode.Overwrite) .format("指定保存格式") .save("保存的路径")/save()/saveAsTable
-
save(Path:String):用于保存文本
-
save():用于保存数据库
-
saveAsTable:保存到Hive表中
-
-
-
小结
-
了解SparkSQL中Sink数据源的设计
-
04:集成Hive:场景及设计
-
目标:掌握SparkSQL集成Hive的场景及设计
-
实施
-
场景
-
离线:对数据仓库中的数据进行分布式计算分析处理
-
数据来源:Hive
-
-
实时:对结构化数据进行分布式实时计算
-
数据来源:Kafka
-
-
利用SparkSQL对Hive数据仓库中的数据进行处理分析
-
-
设计
-
所有需要访问Hive数据仓库的分布式计算服务,只要知道metastore服务的地址,就可以访问Hive元数据了
-
-
配置
-
启动Hive
#第一台机器 start-dfs.sh cd /export/server/hive bin/hive-daemon.sh metastore
-
-
配置SparkSQL
-
Spark的conf目录中创建hive-site.xml,执行metastore服务地址
cd /export/server/spark vim conf/hive-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.uris</name> <value>thrift://node1.itcast.cn:9083</value> </property> </configuration>
- 集群模式,需要分发给Spark所有节点
-
cd conf/ scp hive-site.xml node2:$PWD scp hive-site.xml node3:$PWD
-
-
-
小结
-
掌握SparkSQL集成Hive的场景及设计
-
05:集成Hive:SparkShell测试
-
目标:实现SparkShell测试与Hive的集成
-
实施
-
启动spark-shell
bin/spark-shell --master local[2]
-
方式一
-
直接写SQL操作Hive表
-
测试
spark.sql("show databases").show spark.sql("show tables in db_hive").show spark.sql("select deptno,round(avg(sal),2) as avgsal from db_hive.emp group by deptno").show spark.sql("create table db_hive.tb_test(word string)")
-
-
-
方式二
-
加载Hive表的数据变成DF,可以调用DSL或者SQL的方式来实现计算
-
测试
-
step1:读取数据
val hiveData = spark.read.table("db_hive.emp") hiveData.printSchema hiveData.show
-
step2:转换数据:统计每个部门的平均薪资
-
val data = hiveData .select($"deptno",$"sal") .groupBy($"deptno") .agg(round(avg($"sal"),2).as("avgsal")) rsData.show
-
-
step3:保存结果
import org.apache.spark.sql._ rsData.write.mode(SaveMode.Overwrite).saveAsTable("db_hive.tb_rs") spark.sql("select * from db_hive.tb_rs").show
-
SparkSQL集成Hive:语法与Hive类似,由SparkSQL解析SQL语句变成SparkCore程序
-
-
Hive on Spark:Hive底层用SparkCore作为计算引擎,SQL解析由Hive实现,转换为SparkCore程序
-
hive.executor.engine = mr / spark
-
-
-
-
小结
-
实现SparkShell测试与Hive的集成
-