场景:有一个月,大概3T多的数据需要存储到hive中进行分析,不设置分区的话,查询数据的效率很差
分区键的选择:
这里选择按天分区
分区表的创建
drop table if exists test.demo1;
create table test.demo1(
row_key String comment "",
zdate String comment "",
vid BIGINT comment "",
lat BIGINT comment "",
lon BIGINT comment "",
spd BIGINT comment "",
dir BIGINT comment "",
alt BIGINT comment "",
zstate BIGINT comment ""
)comment ''
partitioned by (zday STRING COMMENT "")
row format delimited fields terminated by '\001'
null defined as ''
stored as textfile;
partitioned by (zday STRING COMMENT "")
定义分区字段名称、类型、注释
将数据写入分区表
insert into test.demo1 partition (zday)
select
*,
substr(t1.zdate,1,10) as zday
from (select a1.* from test.demo1 a1 ) t1;
insert into table_name partition (zday)
插入时指明分区字段
select *,substr(t1.zdate,1,10) as zday
分区字段写在最后
在spark中也可以通过spark sql实现将数据写入分区表,RDD–>DataFrame,创建临时表,执行sql将临时表中的数据写入分区表中
show partitions table_name
查看表中所有分区
总结:
一、什么时候使用分区
下列情况使用分区
(1)读取整个数据集需要花费很长时间
(2)查询几乎只对分区字段进行过滤
(3)分区列有合理数量的不同的值
(4)数据生成或ETL过程是按文件或目录名来分段数据的
(5)分区列值不在数据本身
二、什么时候不使用分区
(1)避免把数据分区到很多小数据文件
–不要对有太多惟一值的列进行分区
(2)注意:当使用动态分区时容易发生
–比如:按照fname来分区客户表会产生上千个分区
在Hive中如何实现数据分区
https://blog.51cto.com/u_11882756/1892468