【日常工作总结】HIve数据导入问题

     最近在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表,重新建立新表,导入亦可。

猜你喜欢

转载自blog.csdn.net/shengmingqijiquan/article/details/80340072