Hive SQL MDL Load 加载数据
- load是将数据移动到Hive表对应的位置,移动时是纯复制或移动操作,Hive不会对表中数据内容进行任何转换和操作。
Load 加载数据语法
filepath
表示待移动数据的路径。可以指向文件,也可以指向目录。filepath
支持三种形式:
- 相对路径:project/data
- 绝对路径:/user/hive/project/data
- 具有schema的完整URI:hdfs://namenode:9000/user/hive/project/data
- 指定LOCAL,将在本地文件系统查找文件路径,此时是复制操作。
- 没有指定LOCAL,此时是移动操作。
- 没有指定LOCAL时,若filepath指向的是一个完整的URI,则直接使用这个URI;若没有指定schema,Hive会使用hadoop配置文件中参数fs.defualt.name指定的(一般是HDFS)
- LOCAL的本地文件系统指的是Hive server2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统。
- 若使用了OVERWRITE关键字,则目标表中已存在的数据会被覆盖,然后再将filepath指向的文件添加到表中。
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION(partcol1=val1,partcol2=val2...)][INPUTFORMAT 'inputformat' SERDE 'serde']
Hive3.0加载数据特性
- Hive3.0+,load加载数据除了移动和复制之外,还会将加载重写为INSERT AS SELECT。
- Hive3.0+,还支持inputformat、SerDe指定输入格式。
- 若表具有分区,而load命令没有指定分区,则将load转换为INSERT AS SELECT,并假定最后一组列为分区列,若文件不符合预期,则报错。
Hive INSERT
INSERT INTO table_name(字段列表) VALUES (值列表);
INSERT + SELECT
- insert+select表示将后面查询返回结果作为内容插入到指定表中。
- 也可以用于动态分区。
- 字段名应一致。
INSERT INTO TABLE student_from_insert SELECT * FROM student;
多重插入
- 一次扫描,多次插入。
- 例:扫描一次student表,选择num和name分别插入表student_insert1和student_insert3。
FROM student
INSERT OVERWRITE TABLE student_insert1
SELECT num
INSERT OVERWRITE TABLE student_insert2
SELECT name;
动态分区插入
- 动态分区插入指的是分区值是由后续的SELECT语句查询结果来动态确定的。
- 相关语法可见动态分区表的创建。
INSERT DIRECTORY导出数据
- Hive支持将SELECT查询的结果导出成文件存放在文件系统中。
- 导出操作是一个覆盖操作,会覆盖路径目标文件。
directory1
是目标文件路径
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 [ROW FORMAT row_format][STORED AS file_format] SELECT ... FROM ...;
INSERT OVERWRITE DIRECTORY '/tmp/hive_export/e1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORC
SELECT * FROM student;
Hive SQL MDL Update
- 对事务表进行update操作
- update事务完成前查询不到update的结果。
UPDATE trans_student
SET age = 20
WHERE id = 1;
Hive SQL MDL Delete
DELETE FROM trans_student WHERE id = 1;