这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
表的分桶操作
1、Hive分桶表是对列值取hash值得方式,将不同数据放到不同文件中存储
2、对于hive中每一个表、分区都可以进一步进行分桶
3、由列的hash值除以桶的个数来决定每条数据划分在哪个桶中
案例
### 单分桶
CREATE table jacquesh_databases.order_bucket
(
order_id int,
order_money double,
pay_money double,
address string,
create_dates timestamp,
cancel_dates timestamp,
cancel_money double
)
CLUSTERED BY (order_id ) INTO 4 BUCKETS ### 依据order_id 平均分配到4个桶中 (也就是说后面的4代表的为桶的个数) 原理: 依据id去哈希取模桶余数 来进行分桶**
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ",";
### 从源数据表中数据同步到分桶表中
INSERT overwrite table jacquesh_databases.order_bucket SELECT order_id,order_money,pay_money,address,create_dates,cancel_dates, cancel_money FROM order_no_partition;
结果:
可以看出在HDFS的文件被切割成了4份
### 分桶加上分区
CREATE table jacquesh_databases.order_partition_bucket
(
order_id int,
order_money double,
pay_money double,
create_dates timestamp,
cancel_dates timestamp,
cancel_money double
)
**partitioned by(address string)
CLUSTERED BY (order_id) INTO 4 BUCKETS #既有分桶操作也有分区操作**
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ",";
### 从源数据表中数据同步到分桶分区表中
INSERT into jacquesh_databases.order_partition_bucket partition(address) SELECT order_id, order_money, pay_money, create_dates, cancel_dates, cancel_money,address FROM jacquesh_databases.order_no_partition;
可从上面看出在分区目录中也把文件分成了4份 Hive分桶的抽样查询
--语句
select * from [表名] tablesample(bucket x out of y on columns)
--TABLESAMPLE语法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个bucket**开始**抽取数据
y:必须为该表总bucket数的倍数或因子
取桶的个数/y个数据
--案例:
select * from [表名] tablesample(bucket x out of y on order_id)
例如下表数据
order_id|order_money|pay_money|address |create_dates |cancel_dates |cancel_money|
--------+-----------+---------+-------------------+-----------------------+-----------------------+------------+
4| 157.0| 157.0|2020-02-20 23:58:34|2020-02-20 23:58:44.000|1970-01-01 08:00:00.000| |
8| 53.0| 53.0|2020-02-20 23:56:12|2020-02-20 23:56:16.000|1970-01-01 08:00:00.000| |
1| 178.8| 0.0|2020-02-21 00:00:00| |1970-01-01 08:00:00.000| |
5| 64.8| 0.0|2020-02-20 23:57:04|2020-02-20 23:57:11.000|1970-01-01 08:01:04.800| |
2| 21.0| 21.0|2020-02-20 23:59:54|2020-02-21 00:00:02.000|1970-01-01 08:00:00.000| |
6| 327.7| 148.9|2020-02-20 23:56:39|2020-02-20 23:56:53.000|1970-01-01 08:02:58.800| |
3| 37.0| 0.0|2020-02-20 23:59:35| |1970-01-01 08:00:00.000| |
7| 357.0| 357.0|2020-02-20 23:56:36|2020-02-20 23:56:40.000|1970-01-01 08:00:00.000| |
共有8条数据
使用
select * from jacquesh_databases.order_bucket tablesample(bucket 4 out of 8 )
可以得到数据
order_id|order_money|pay_money|address |create_dates|cancel_dates |cancel_money|
--------+-----------+---------+-------------------+------------+-----------------------+------------+
3| 37.0| 0.0|2020-02-20 23:59:35| |1970-01-01 08:00:00.000| |
说明 : 在第4个桶 取数据 取第四个桶所有数据的4/8条数据 也就是说取出 桶中数据的1/2条数据 也就是一条数据