Hive模式设计
按天划分的表
表名中加入一个时间戳,table_2017_03_01
//对于Hive,应该使用分区表
CREATE TABLE <table> (col1 Type) PARTITION BY (day INT)
关于分区
分桶表数据存储,可以解决找不到好的、大小相对合适的分区方式
唯一键和标准化
同一份数据多种处理
INSERT OVERWRITE TABLE <to_table1>
SELECT * FROM <from_table> WHERE ..;
INSERT OVERWRITE TABLE <to_table2>
SELECT * FROM <from_table> WHERE ..;
FROM <from_table>
INSERT OVERWRITE <to_table1> SELECT * WHERE ...
INSERT OVERWRITE <to_table2> SELECT * WHERE ...
对于每个表的分区
中间表的时候(同时运行两个实例,可能会相互影响),建议使用分区表
分桶表数据存储
分桶是将数据集分解成更容易管理的若干部分
CREATE TABLE <table>(col1 Type, col2 Type, col2 Type)
PARTITIONED BY (par Type)
CLUSTERED BY (col1 Type) INTO 96 BUCKETS;
//插入数据
set hive.enforce.bucketing=true;
INSERT OVERWRITE TABLE <table> PARTITION (par = '')
SELECT col1, col2, col3 FROM <other_talbe> WHERE par=''
//如果没有hive.enforce.bucketing属性,使用set mapred.reduce.tasks设置和分桶个数相匹配的reducer个数,然后在SELECT语句后增加CLUSTER BY语句
set mapred.reduce.tasks=96;
INSERT OVERWRITE TABLE <table> PARTITION (par = '')
SELECT col1, col2, col3 FROM <other_talbe> WHERE par='' CLUSTER BY col1;
利于执行mpa-side JOIN
为表增加列
在原始数据文件上,新增字段。无法在已有字段的开始或者中间增加新字段
ALTER TABLE <table> ADD COLUMNS(col Type)
使用列存储表
一般使用行式存储,SerDe列式来以混合列式格式存储信息
1.重复数据
一个表中,某些字段会有重复数据,比如年龄,使用列存储效果会很好
2.多列
(几乎)总是使用压缩