Hive分区值的插入

对于Hive分区表,在我们插入数据的时候需要指定对应的分区值,而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致,或者提供的分区值是NULL的情况,下面我们依次来展现下不同情况下的表现。

1. 静态分区和动态分区

假如建表如下:

create table tbl_name(xxx) partitioned by(pt xxx, online xxx);

Hive默认是静态分区,即明确指定分区值,写法如下:

insert overwrite table tbl_name partition(pt=20121023, if_online=1)

select field1, field2, ..., fieldn

from tbl where xxx;

有时,我们就需要使用动态分区,因为需要根据某些字段来选择插入对应的分区里,不能指定分区值。首先要开启动态分区设置:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

然后写法如下(注意select最后的字段值就是对应这分区值):

insert overwrite table tbl_name partition(pt, if_online)

select field1, field2, ..., pt, if_online

from tbl where xxx;

动态分区与静态分区还有一个细微的差别是,静态分区一定会创建分区,不管SELECT语句的结果有没有数据。而动态分区,只有在SELECT结果的记录数>0的时候,才会创建分区。因此在不同的业务场景下,可能会选择不同的方案。静态和动态并不是分区的属性,而只是指定值与不指定值的区别。另外可以混合使用动态和静态分区,不过要注意,静态分区列一定要在动态分区列前面。

2. 提供的分区值和分区字段类型不一致

这会导致数据会被插入到对应的分区值里,show partitions xxx也能显示出对应的分区值,但是在s查询时,有可能分区值是NULL,是不是NULL要看分区字段类型是否能兼容提供的分区值。

比如:

情况1:分区字段类型是int,提供的分区值是string(含有非数字)

create table t2(a int, b string) partitioned by(dt int);

insert into t2 partition(dt='2222') values(1, 'xxxx');

insert into t2 partition(dt='asd') values(2, 'xxxx');

情况2:分区字段类型是string,提供的分区值是int

create table t3(a int, b string) partitioned by(dt string);

insert into t3 partition(dt=111) values(2, 'xxxx');

insert into t3 partition(dt='asd') values(1, 'xxxx');

3. 提供的分区值是NULL

只有动态分区才能提供分区值是NULL的情况,即

Insert into table partition(分区字段) select f1,f2...分区值 from xxx

然后分区值又没有值,即是null的情况下,这会导致Hive写入到默认分区 __HIVE_DEFAULT_PARTITION__里去。

相关推荐
秃头菜狗1 天前
十三、格式化 HDFS 文件系统、启动伪分布式集群
大数据·hadoop·hdfs
笨蛋少年派1 天前
Hadoop简介
大数据·hadoop
Hello.Reader1 天前
Flink 高级配置发行版剖析、Scala 版本、Table 依赖与 Hadoop 集成实战
hadoop·flink·scala
IT毕设梦工厂2 天前
大数据毕业设计选题推荐-基于大数据的人口普查收入数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
计算机源码社2 天前
基于Hadoop的车辆二氧化碳排放量分析与可视化系统|基于Spark的车辆排放量实时监控与预测系统|基于数据挖掘的汽车排放源识别与减排策略系统
大数据·hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计
计算机编程小央姐3 天前
大数据工程师认证项目:汽车之家数据分析系统,Hadoop分布式存储+Spark计算引擎
大数据·hadoop·分布式·数据分析·spark·汽车·课程设计
大数据CLUB3 天前
基于mapreduce的资金流入流出任务计算
大数据·hadoop·mapreduce
计算机毕设残哥4 天前
基于Hadoop+Spark的人体体能数据分析与可视化系统开源实现
大数据·hadoop·python·scrapy·数据分析·spark·dash
AI悦创|编程1v14 天前
00-1-正则表达式学习心得:从入门到上瘾,再到克制
数据仓库·正则表达式·数据挖掘·ai悦创编程一对一教学·python一对一辅导·python一对一教学
IT研究室4 天前
大数据毕业设计选题推荐-基于大数据的全球产品库存数据分析与可视化系统-大数据-Spark-Hadoop-Bigdata
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata