Hive:加载数据到表的方式

将文件加载到表中

加载本地文件到hive表

1
load data local inpath 'linux_path' into table default.emp;

加载hdfs文件到hive中

(overwrite 覆盖掉原有文件,overwrite在原文件中追加)

1
load data inpath 'hdfs_path' overwrite into table default.emp;

会将数据文件从原来的hdfs路径移动(mv)到建表时location指定目录

创建表的时候通过location指定加载

1
2
3
4
5
6
create EXTERNAL table IF NOT EXISTS default.emp_ext(
empno int,
ename string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘
location ‘/user/hive/warehouse/emp_ext‘;

适用于建(外部)表时,数据文件已经存在的情况

通过查询将数据插入到 Hive 表中

创建表时通过insert加载

1
2
3
4
5
6
7
8
9
Standard syntax:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...

Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...
1
2
create table default.emp_ci like emp;
insert overwrite table default.emp_ci select * from default.emp;

from table 多重插入数据方式multiple inserts

1
2
3
from test1
insert overwrite table test2 partition (age) select name,address,school,age
insert overwrite table test3 select name,address

Hive支持多表插入,可以在同一个查询中使用多个insett子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出!这是一个优化,可以减少表的扫描,从而减少 JOB 中 MR的 STAGE 数量,达到优化的目的。

CREATE TABLE LIKE 语句

  • 用来复制表的结构
  • 需要外部表的话,通过create external table as …指定
  • 不CTAS语句会填充数据

创建表并加载数据(as select)

1
create table default.emp_ci as select * from emp;

CTAS建表语句(CREATE TABLE AS SELECT)

  • 使用查询创建并填充表,select中选取的列名会作为新表的列名(所以通常是要取别名)
  • 会改变表的属性、结构,比如只能是内部表、分区分桶也没了
  • 目标表不允许使用分区分桶的,FAILED: SemanticException [Error 10068]: CREATE-TABLE-AS-SELECT does not support partitioning in the target table
  • 对于旧表中的分区字段,如果通过select * 的方式,新表会把它看作一个新的字段,这里要注意
  • 目标表不允许使用外部表,如create external table … as select…报错 FAILED: SemanticException [Error 10070]: CREATE-TABLE-AS-SELECT cannot create external table
  • CTAS创建的表存储格式会变成默认的格式TEXTFILE
  • 对了,还有字段的注释comment也会丢掉,同时新表也无法加上注释
  • 但可以在CTAS语句中指定表的存储格式,行和列的分隔符等
1
2
3
4
5
6
7
8
create table xxx as select ...

create table xxx
row format delimited
fields terminated by ' '
stored as parquet
as
select ...

从 SQL 向表中插入值

1
2
Standard Syntax:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

通过insert向Hive表中插入数据可以单条插入和多条插入

1
2
insert into emp values(1,'xiaoming'); #单条插入
insert into emp values(2,'xiaohong'),(3,'xiaofang'); #多条插入

参考链接:

https://www.docs4dev.com/docs/zh/apache-hive/3.1.1/reference/LanguageManual_DML.html#LanguageManualDML-Loadingfilesintotables

https://blog.csdn.net/lzw2016/article/details/97811799