Spark基础学习笔记27:Spark SQL数据源 - Hive表
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark基础学习笔记27:Spark SQL数据源 - Hive表相关的知识,希望对你有一定的参考价值。
文章目录
零、本讲学习目标
- 掌握如何读取Hive表中的数据
- 掌握如何将数据写入到Hive表
一、Spark SQL支持读写Hive
- Spark SQL还支持读取和写入存储在Apache Hive中的数据。然而,由于Hive有大量依赖项,这些依赖项不包括在默认的Spark发行版中,如果在classpath上配置了这些Hive依赖项,Spark就会自动加载它们。需要注意的是,这些Hive依赖项必须出现在所有Worker节点上,因为它们需要访问Hive序列化和反序列化库(SerDes),以便访问存储在Hive中的数据。
- 在使用Hive时,必须实例化一个支持Hive的SparkSession对象。若系统中没有部署Hive,则仍然可以启用Hive支持(Spark SQL充当Hive查询引擎)。Spark对Hive的支持包括连接到持久化的Hive元数据库、Hive SerDe、Hive用户定义函数、HiveQL等。如果没有配置hive-site.xml文件,Spark应用程序启动时,就会自动在当前目录中创建Derby元数据库metastore_db,并创建一个由
spark.sql.warehouse.dir
指定的数据仓库目录(若不指定,则默认启动Spark应用程序当前目录中的spark-warehouse
目录)。需要注意的是,从Spark2.0.0版本开始,hive-site.xml
中的hive.metastore.warehouse.dir
属性不再使用了,代替的是使用spark.sql.warehouse.dir
指定默认的数据仓库目录。
二、Spark配置hive-site.xml
- 将Hive配置文件
hive-site.xml
拷贝到Spark配置目录,执行命令:cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf
- 进入Spark配置目录,编辑Hive配置文件
hive-site.xml
<property>
<name>spark.sql.warehouse.dir</name>
<value>/user/spark/warehouse</value>
</property>
三、准备工作
- 先要启动HDFS和Spark
(一)启动Hive的metastore
- 执行命令:
hive --service metastore &
(二)启动Spark Shell
- 执行命令:
spark-shell --master spark://master:7077
四、Spark读写Hive数据
(一)导入SparkSession
- 执行命令:
import org.apache.spark.sql.SparkSession
(二)创建SparkSession对象
val spark = SparkSession.builder()
.appName("Spark Hive Demo")
.enableHiveSupport() // 开启Hive支持
.getOrCreate()
- 执行上述命令
(三)执行HiveQL语句
- 调用SparkSession对象的
sql()
方法可以传入需要执行的HiveQL语句。
1、创建Hive表
- 创建一张Hive表
student
,并指定字段分隔符为半角逗号“,
”,执行命令:spark.sql("CREATE TABLE IF NOT EXISTS student(id INT, name STRING, gender STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','")
2、导入本地数据到Hive表
- 查看本地文件
/home/student.txt
的内容
- 将该文件数据导入表
student
中,执行命令:spark.sql("LOAD DATA LOCAL INPATH '/home/student.txt' INTO TABLE student")
- 这个报错是
hdfs
客户端的一个bug
,但并不影响作业正常运行,且在2.8
版本之后已经修复
3、查询Hive表数据
- 查询表
student
的数据并显示到控制台,执行命令:spark.sql("SELECT * FROM student").show()
- 按性别分组统计平均年龄,执行命令:
spark.sql("SELECT gender, AVG(age) FROM student GROUP BY gender").show()
4、创建表时指定存储格式
- 创建一个Hive表
test
,数据存储格式为Parquet
(默认为普通文本格式),执行命令:spark.sql("CREATE TABLE test (name STRING, age INT) STORED AS PARQUET")
5、将数据帧数据写入Hive表
- 使用
saveAsTable()
方法可以将数据帧数据写入指定的Hive表中。 - 加载
student
表数据得到数据帧
- 导入SaveMode类,执行命令:
import org.apache.spark.sql.SaveMode
- 将数据帧数据写入hive表,执行命令:
studentDF.select("name", "age").write.mode(SaveMode.Overwrite).saveAsTable("test")
- 查询
test
表数据,执行命令:spark.sql("select * from test").show()
6、导入HDFS数据到Hive表
- 查看HDFS文件
/input/student.txt
的内容
- 创建Hive表
student1
,执行命令:spark.sql("CREATE TABLE IF NOT EXISTS student1 (id INT, name STRING, gender STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','")
- 将该文件数据导入表
student1
中,执行命令:spark.sql("LOAD DATA INPATH 'hdfs://master:9000/input/student.txt' INTO TABLE student1")
- 查看表
student1
的内容,执行命令:spark.table("student1").show()
(四)在Hive客户端查看生成的hive表
- 查看三张表:
student
,student1
和test
以上是关于Spark基础学习笔记27:Spark SQL数据源 - Hive表的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记Spark—— Spark SQL应用—— Spark DataFrame基础操作
Spark基础学习笔记28:Spark SQL数据源 - JDBC
Spark基础学习笔记25:Spark SQL数据源 - Parquet文件
学习笔记Spark—— Spark SQL应用—— Spark DataSet基础操作