最近在BDP平台上向Hive表中导入数据时,频频出错,踩过很多坑之后,才发现,原来是是表格式的问题,表格式为OCR,不支持传统文件导入,只支持表与表之间的导入。借此机会总结一下hive导入数据的内容。
数据导入的几种方式:
一.从本地文件系统中导入数据
hive> LOAD DATA LOCAL INPATH "/home/hadoopUser/data/test1.txt" into table tablename
二、从HDFS文件系统加载数据到Hive
hive> LOAD DATA INPATH "/input/test1.txt" into table tablename
备注:LOCAL指的是本地文件系统,不加LOCAL默认HDFS文件系统
三.通过查询语句向表中插入数据
hive> INSERT INTO TABLE test2 SELECT * FROM test1;
四、分区插入
(1) 静态分区插入
①创建分区表
hive> CREATE TABLE test2(name STRING,address STRING,school STRING)
> PARTITIONED BY(age float)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE ;
此处创建了一个test2的分区表,以年龄分区
②从查询结果中导入数据
hive> INSERT INTO TABLE test2 PARTITION (age='24') SELECT name,address,school FROM test1;
(2) 动态分区插入
静态分区需要创建非常多的分区,那么用户就需要写非常多的SQL!Hive提供了一个动态分区功能,其可以基于查询参数推断出需要创建的分区名称。
① 创建分区表,此过程和静态分区创建表一样,此处省略
② 参数设置
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;
注意:动态分区默认情况下是没有开启的。开启后,默认是以”严格“模式执行的,在这种模式下要求至少有一列分区字段是静态的。这有助于阻止因设计错误导致查询产生大量的分区。但是此处我们不需要静态分区字段,估将其设为nonstrict。
③ 数据动态插入
hive> insert into table test2 partition (age) select name,address,school,age from test1;
注意:查询语句select查询出来的age字段必须放在最后,和分区字段对应,不然结果会出错
注意:若hive表为OCR存储格式,则不支持文件导入方式,需要先导入临时表,然后从临时表导入目标表。或者删除OCR表,重新建立新表,导入亦可。