Hive分区
- 描述: Hive分区根据某字段的值分区
1.可以多维度分区
2.分区不会影响大范围查询的执行效率
3.每个分区为一个目录
4.分区下可继续分区或者分桶 - 优点:限制在某个或者某些区间的值查询,处理速度会非常快
- 创建分区执行语句:PARTITIONED BY
- 例:创建日志表,按照dt与country分区
CREATE TABLE logs(ts bigint,
line string)
PARTITIONED BY(dt string,country string)
- 数据加载到分区表时,要显性指定分区值:
LOAD DATA LOCAL INPATH 'input/hive/partitions/file1'
INTO TABLE logs
PARTITION (dt='2001-01-01',country='GB')
- 查看Hive中数据有哪些分区
hive > SHOW PARTITIONS logs;
Hive分桶
- 描述:将数据按桶的方式放入不同的桶中(按照某列值的hash计算,除以桶的个数取余,余数相同的在一个桶)
- 优点:
- 取样更高效:在处理大规模数据时,在开发和查询阶段,在桶内试运行和查询一小段数据,可以方便很多
- 获取更高的查询效率:桶为表加上了额外的数据结构,具体而言就连接两个相同
列上划分桶的表,可以使用map端进行连接(map_side_join)高效实现,处理左
边表某个桶的mapper就知道,右边表桶内相匹配行对应的桶
,两边表桶的个数不一定要一样,倍数也行 - 桶可以根据一个或者多个列进行排序,这样对每个桶的连接就相当于一个归并排
序,进一步提升了map的效率
- 创建桶执行的语句:使用CLUSTERED BY (列) INTO 桶数 BUCKETS
CREATE TABLE user (
id INT ,
name STRING,
age INT
)
CLUSTERED BY (id) INTO 4 BUCKETS ;
- 创建桶时对桶进行排序:
CREATE TABLE user (
id INT ,
name STRING,
age INT
)
CLUSTERED BY(id) SORTED BY (id ASC) INTO 4 BUCKETS;
- 向分桶后的表添加数据
将hive.enforce.bucjeting属性设置为true。这样hive就知道用表定义中的声明创建桶
INSERT OVERWRITE TABLE user
SELECT * FROM data
后续的还会遇到坑还会继续添加
网友评论