Hive桶表

x33g5p2x  于2021-03-14 发布在 Hive  
字(0.9k)|赞(0)|评价(0)|浏览(210)

桶表:

  • 我们已经学了内部表和外部表,以及使用分区表对数据进行细分管理,其实对于一个表和一个分区,Hive还可以进行更为细致的数据划分和管理,也就是桶(Bucket)。
  • Hive也是针对某一列进行桶的组织,Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶里。
  • 把表或者分区组织成桶的以下两个理由:
    • 获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理某些查询时能利用这个结构。例如两张表JOIN连接,可以对这两张表进行桶操作,数据放在一张桶表进行查询,可以大大减少JOIN操作的数据量。
    • 使取样更高效。我们处理大规模数据集时,有时候并不需要对所有数据进行分析,只抽取一部分数据来进行分析。

[info] (1)创建桶表,以外部表的数据为例,建立一个和外部表一样的桶表

# 指定按照num的哈希值与4取模来分桶,分4桶

create table if not exists  bk_log_table (
num string, 
code string, 
name string,
fee string, 
type string,
status string,
time string
)   
CLUSTERED BY(num) into 4 buckets      
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

[info] (2)为桶表添加数据

# 因为新建的桶表是空,需要将之前实验外部表的数据导入bk_log_table中
# 需要将 hive.enforce.bucketing 设置为true,才能够创建桶表时自定义桶数量
set hive.enforce.bucketing = true;

# 添加数据
insert into bk_log_table select * from innerTable_log;

[info] (3)查看HDFS结构

:-:

[info] (4)查询桶表

桶数计算
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个桶开始进行抽样
y:抽样桶数 = 总桶数/y

# 抽样一桶数据
select * from bk_log_table TABLESAMPLE(BUCKET 2 OUT OF 4);

#抽样二桶数据
select * from bk_log_table TABLESAMPLE(BUCKET 2 OUT OF 2);

相关文章