Spark - 使用SparkSQL将数据写入Hive表详解1(使用inserInto()方法)
作者:hangge | 2024-07-17 08:31
在之前的文章中,我介绍了如何在 SparkSQL 中集成 Hive 并查询 Hive 表中的数据(点击查看)。实际工作中,我们不仅需要查询数据并计算结果,还希望将结果数据写入 Hive 表中。通常来说,向 Hive 表中写入数据有如下 3 种方法。
(2)然后给表中添加一些初始数据:
(2)查看这个表的数据也是都有的:
(3)最后到 HDFS 中确认一下数据文件里面的内容:
- 第一种:使用 inserInto() 方法。
- 第二种:使用 saveAsTable() 方法。
- 第三种:使用 SparkSQL 语句。
其中第二种不推荐使用,最常用的是第三种,用起来比较方便。接下来我将依次详细介绍这三种方法,本文首先介绍第一种使用 inserInto() 方法。
一、使用 inserInto() 方法写入Hive表数据
1,准备工作
(1)首先我们在 hive 中创建一张 student 表:
create table student ( id int, stu_name string, stu_birthday date, online boolean ) row format delimited fields terminated by '\t' lines terminated by '\n';
(2)然后给表中添加一些初始数据:
load data local inpath '/usr/local/student.txt' into table student;
![](http://hangge.com/blog_uploads/202407/2024071215410951989.png)
2,编写代码
(1)首先我们的项目要做好 Hive 的集成配置,具体可以参考我之前写的文章:
(2)接着我们编写如下测试代码,用于通过 SparkSQL 从 Hive 的 student 表查询数据并将其写入到另一个 Hive 表 student_bak。同时在写入前会创建目标表 student_bak(如果不存在),并指定数据写入模式为覆盖。
(1)使用 inserInto() 方法写入 hive 表数据需要满足 2 个条件:
- 写入的 Hive 表是存在的(可以在 Hive 中建表,或者通过 SparkSQL 建表,官方建议在 Hive 中建表!)
- DataFrame 数据的 Schema 结构顺序和写入的 Hive 表的 Schema 结构顺序是一样的
(2)通过 SparkSQL 创建 Hive 表时,如果想指定存储格式等参数(默认 TextFile),必须使用 using hive
- 这样指定是无效的:create table t1(id int) OPTIONS(fileFormat 'parquet')
- 这样才是有效的:create table t1(id int) using hive OPTIONS(fileFormat 'parquet')
- create table t1(id int) 等于 create table t1(id int) using hive OPTIONS(fileFormat 'textfile')
import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession object SparkSQLWriteHive_1 { def main(args: Array[String]): Unit = { val conf = new SparkConf() .setMaster("local") //获取SparkSession,为了操作SparkSQL val sparkSession = SparkSession .builder() .appName("SparkSQLWriteHive_1") .config(conf) //开启对Hive的支持,支持连接Hive的MetaStore、Hive的序列化、Hive的自定义函数 .enableHiveSupport() .getOrCreate() import sparkSession.sql //查询数据 val resDf = sql("select * from student") //创建目标表 sql( """ |create table if not exists student_bak( | id int, | stu_name string, | stu_birthday date, | online boolean |)using hive | OPTIONS( | fileFormat 'textfile', | fieldDelim '\t' | ) |""".stripMargin) //写入数据 resDf.write //指定数据写入格式append:追加。overwrite:覆盖。 .mode("overwrite") //这里需要指定数据格式: parquet, orc, avro(需要添加外部依赖包), json, csv, text。 //不指定的话默认是parquet格式。 //针对insertInto而言,因为它是向一个已存在的表中写入数据,所以format参数和option参数会被忽略。 //.format("text") .insertInto("student_bak") sparkSession.stop() } }
3,运行测试
(1)上面代码运行后,我们可以到到 Hive 中查看目标表的详细信息:
show create table student_bak;
![](http://hangge.com/blog_uploads/202407/2024071216063544769.png)
(2)查看这个表的数据也是都有的:
select * from student_bak;
![](http://hangge.com/blog_uploads/202407/2024071216075369812.png)
(3)最后到 HDFS 中确认一下数据文件里面的内容:
hdfs dfs -cat /user/hive/warehouse/student_bak/*
![](http://hangge.com/blog_uploads/202407/2024071216085769096.png)
全部评论(0)