hive中如果有分区的话,如果是需要自己构造数据且不知道是否有分区,可以使用这条语句看是否有分区:
show create table tabletest;
tabletest为需要看是否有分区的表,执行这条语句之后会有这样一条出来:
PARTITIONED BY ( ******
string) ,****** 即为分区的字段,string为该字段的数据类型,如果没有打印这个语句的话证明这个表没有分区。
简单的建一张无分区的hive表:
create table mytest (student string,height int,grade int);
向这张表中load一条数据如下:
INSERT INTO TABLE mytest select 'zhangsan',176,78;
或者
INSERT INTO TABLE mytest values ('zhangsan1',176,78);
或者从别的表里面查出数据load进去:
INSERT INTO TABLE mytest select test1,test2,test3 from testtable ;
load之后如图:
建一张有分区的表:
create table mytest (student string,height int,grade int) partitioned by (ymd string);
注意:如果使用以上的语句来load这张表的话就会报错,如下:
向这张表load数据如下:
INSERT INTO TABLE mytest partition (ymd='2018-12-11') values ('zhangsan1',176,78);
或者
INSERT INTO TABLE mytest partition (ymd='2018-12-11') select 'zhangsan2',176,78;
load数据如下图:
以下语句也是向表中load数据的:
INSERT overwrite TABLE mytest partition (ymd='2018-12-11') select 'dddddd',176,78;
这条语句会把mytest表中所有的ymd='2018-12-11’的数据替换成本条语句load的数据结果,执行这条语句的结果如下:
insert into语句是向表中追加数据,insert overwrite是向表中替换数据。
还有这样的写法:
INSERT into TABLE mytest partition (ymd) select 'testname',176,78;
不过这里执行的话会报错
参见提示,我们需要设置一下(直接在hive运行):set hive.exec.dynamic.partition.mode=nonstrict
简单记录一下,有几篇比较好的文章推荐给大家:
hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区
INSERT … VALUES, UPDATE, and DELETE SQL Statements
Hive静态分区表&动态分区表
导入数据到hive表中的6种方式
hive从查询中获取数据插入到表或动态分区