一、hive的分区
1. hive的分区 VS 传统关系型数据库分区
参考:https://www.cnblogs.com/yongjian/archive/2017/03/29/6640951.html
Hive分区的概念与传统关系型数据库分区不同。
- 传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区。
- Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
- Hive分区是在创建表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,但是Hive下的数据文件中并不包含这些列,因为它们是目录名。
2. 静态分区
- 创建一张静态分区表
create table pz_test_business_search (
interface_name string comment'接口名称',
interface_param_in string comment'接口入参',
invoke_time string comment'调用时间'
)
partitioned by (month_id string, day_id string,part_id string)--分区字段,month_id => 年月,day_id => 日,part_id => 小时分钟
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','---数据列分隔符
STORED AS TEXTFILE;
- 查看表结构
hive> desc pz_test_business_search ;
OK
interface_name string 接口名称
interface_param_in string 接口入参
invoke_time string 调用时间
month_id string
day_id string
part_id string
# Partition Information
# col_name data_type comment
month_id string
day_id string
part_id string
Time taken: 0.505 seconds, Fetched: 13 row(s)
- 向表中加载数据,分区为month_id=201812,day_id=19,part_id=9999
需要加载的文件存储在hdfs上,hdfs中文件的路径为“pz_testTopic/201812/19/pa_testTopic.1545272830372.txt”
文件中数据格式如下:
interface1,param1,2018-12-19 10:12:32
interface2,param2,2018-12-19 10:13:10
interface3,param3,2018-12-19 15:11:30
interface4,param4,2018-12-19 23:45:01
--将正确数据load到表中,指定分区值
--如果是本地文件,则使用load data local inpath '文件路径' ...
load data inpath '/pz_testTopic/201812/19/pa_testTopic.1545272830372.txt'
INTO TABLE pz_test_business_search
PARTITION (month_id='201812',day_id='19',part_id