Hive(8)--Hive操作语句(4)

·  阅读 44

这是我参与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;
复制代码

结果:

Untitled.png

可以看出在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;
复制代码

微信截图_20211118145914.png

微信截图_20211118145956.png

可从上面看出在分区目录中也把文件分成了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条数据    也就是一条数据
复制代码
分类:
后端
标签: