开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_Hive_写入数据_编码和配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12063
SparkSQL 读写_Hive_写入数据_编码和配置
内容介绍:
一、步骤一:读取数据
二、步骤二:将数据写入到 HDFS 的 Hive 中
三、课堂总结
一、步骤一:读取数据
要把数据插入到 HDFS 中,首先要先有数据,因此第一步是读取数据。
1、上传到 HDFS
读取数据是读 HDFS 上的文件,而不是读本地文件。因为 HiveAcess 程序会放在集群当中运行,无法保证这段程序里的 task 在同一 worker 里执行,无法保证他在哪一台机器里执行,要把文件上传到所有的机器中才能读取本地文件,而所有的机器都可以读取 HDFS 中的文件,它是外部系统,因此上传到 HDFS 当中就可以解决问题。
进入编辑窗口,进入/export/dataset,该目录下有一个叫做 studenttab10k 的文件,是从前面的章节当中上传进来的。
hdfs dfs -put studenttab10k /dataset/
回车上传,结果显示该文件已存在,即上传成功。
2、使用 DF 读取数据
打开 studenttab10k 文件,如下:
其为 csv 文件,即每个数据和下一个数据之间都使用逗号作为分隔,且以逗号分隔的文件可以改为以制表符分隔的文件。而该文件与 csv 文件十分相似,只不过该文件的分隔符是 tab。
DateFrame 需要结构信息的,那么使用 DateFrame reader 读文件时也要赋予其结构信息而该文件中不包含结构信息。其第一列是 Name,但没有列名,第二列是 age,但没有列名,第三列是平均分数,也没有列名,且也没有说明数据类型的数据,因此需要指定其 schema 信息。
综上所需,其实需要完成两项任务,即修改分格符和指定 schema 信息。
val schema = structType
//structType 导入为 structType(org.apache.spark.sql.types) structType.type 下的类
List(
Structfield("name",StringType),
Structfield("age",IntegerType),
Structfield("gpa",FloatType)
//编写构造方法,其中接收 List,即其所有的字段,整个
structType 是一个 schema,而这个 schema 里由几列构成,因
此要为每一个列创建字段,用字段标注,因此 List 中是每一列的信
息,叫做 Structfield,且包仍为 structType(org.apache.
spark.sql.types) structType.type 下的包。
)
)
val dateframe = spark.read
//读取数据,且读取完毕后生成一个 dateframe
.option("delimiter","\t")
//指定分隔符 delimiter 为\t
.schema(schema)
//传入结构信息,而 schema 接收的是 structType 类型
.csv("hdfs://node01/dataset/studenttab10k")
//其中 node01 可以忽略
val resultDF = dataframe.where('age > 50')
//直接生成 resultDF 获取 dataframe,且指查询大于 50 岁的,但此时系统报错。这是因为要使用这种形式来取列,则应提前输入 import spark.implicits._
导入 spark 对象中的 implicits 的所有隐式转换,即可生成 resultDF。
二、步骤二:将数据写入到 HDFS 的 Hive 中
1、写入数据
使用写入表的 API,叫做 saveAsTable,将 DateFrame 写入即可,且只需要指定一下表名即可,SparkSQL 会自动地读取 MetaStore 里的原信息。
resultDf.write.mode(SaveMode.OverWrite).saveAsTable("spark03.student")
//指定写入模式,将写入模式指定为 SaveMode.OverWrite.
//指定表名,我们需要是某一数据库里面的某一张表,则先要指定库名为 spark03 再上表名 student。
//此时数据写入成功。
2、运行程序
该程序应放在集群里运行,而不能在本地运行,使用 Maven 的 package 打包,执行命令,最终运行结果显示 BUILD success,而打包的结果在 target 目录中。
打开代码编辑窗口,输入 cd 进入到用户的根目录,清除屏幕。选择 Upload to current folder 找到对应的 Original spark0.1.0.jar,
点击打开就会进行数据的上传。输入 ls 查看,即可查询到 Original spark0.1.0.jar。
3、提交程序
使用 submit 命令提交运行程序。如果想在任意目录使用命令,就需要配置 perfile。
spark submit --master spark://node01:7077 --class cn.itcas
t.spark.sql.HiveAcess
//指定 master 为集群 node01:7077 master 节点。
//指定 Class,告知 Spark 运行的类。进入 idea 中复制类名,具体操作为点击最上面的类名,点击右键,选择 Copy Reference(复制依赖),然后返回代码编辑窗口粘贴,即可以指定包的位置 original spark。这里不配置特别复杂的参数,直接运行,运行结果显示 Persisting file based data source table 'spark03','student'…
hive>select * from spark03.student
//进入 Hive 查看数据,检查是不是只有 50 岁以上的,如果是,则没有问题。运行结果中发现确实没有低于 50 岁的数据,说明插入数据成功。
三、课堂总结
主要学习了 SparkSQL 如何将数据插入到 Hive 表中,包括两个步骤,即先进行配置,再编写代码。在编写代码时,先读取再处理,再编写。
在配置阶段,要 enable Hivesupport,再去指定 warehouse(该配置必须指定)。