Hive 之 查询 04-分桶及抽样查询

本文介绍了Hive中的分桶表数据存储和抽样查询。分桶类似于Hadoop分区,通过创建分桶表并调整属性实现数据分桶。抽样查询允许在大型数据集中获取代表性结果,使用TABLESAMPLE(BUCKET x OUT OF y)语法,根据y的比例抽取bucket数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎大家扫码关注我的微信公众号:
数据之恋

Hive 之 查询 04-分桶及抽样查询

一、 分桶表数据存储

分区针对的是数据的存储路径, 分桶针对的是数据文件;

分区提供一个隔离数据和优化查询的便利方式。 不过, 并非所有的数据集都可以形成合理的分区。 特别是要确定合适的划分大小这个问题。

【注】分桶类似于 Hadoop 里面的分区;

如:

创建分桶表:

hive (default)> create table stu_buck(
              > id int, 
              > name string)
              > clustered by(id)
              > into 4 buckets
              > row format delimited fields terminated by '\t';
OK
Time taken: 2.17 seconds

查看表结构:

hive (default)> desc formatted stu_buck;
OK	 
... ...                	 
Num Buckets:        	4                   	 
Bucket Columns:     	[id]
... ...              
Time taken: 0.449 seconds, Fetched: 28 row(s)

导入数据:

### Hive 表的概念及使用方法 #### 什么是表? Hive 中的表是一种用于组织据的技术,它通过对指定列的值进行哈希运算,并将其配到不同的中。这种技术有助于提升查询性能,尤其是在大规模据集上执行连接操作时[^1]。 #### 创建表 要创建一个表,需要在 `CREATE TABLE` 语句中定义 `CLUSTERED BY` 子句。以下是创建表的基本语法: ```sql CREATE TABLE bucketed_table ( id INT, name STRING, value DOUBLE ) CLUSTERED BY (id) INTO 32 BUCKETS; ``` 上述代码片段展示了如何创建一张名为 `bucketed_table` 的表,其中 `id` 列被用来作为依据,整个表会被为 32 个[^3]。 #### 填充表 为了使生效,在向表插入据时,必须启用动态功能并设置相应的参。以下是一些常用的配置项及其含义: - `set hive.enforce.bucketing = true;`: 启用强制模式。 - `SET hive.exec.dynamic.partition.mode=nonstrict;`: 设置动态区模式为非严格模式(如果涉及区)。 下面是一个完整的示例,展示如何将据写入表: ```sql -- 开启支持 SET hive.enforce.bucketing = true; -- 插入据到表 INSERT OVERWRITE TABLE bucketed_table SELECT * FROM source_table DISTRIBUTE BY id; ``` 在此过程中,`DISTRIBUTE BY` 关键字确保每一条记录按照 `id` 列的值均匀布到各个中。 #### 查询优化 当两张已经的表按相同的字段(如 `id` 字段)进行 JOIN 操作时,无需再对整张表做笛卡尔积,从而显著减少计算量和资源消耗[^2]。 #### 抽样查询 除了常规查询外,还可以通过抽样的方式访问部的内容。例如,假设某表有 64 个,则可以通过如下 SQL 获取第 3 个据样本: ```sql SELECT * FROM bucketed_table TABLESAMPLE(BUCKET 3 OUT OF 32); ``` 这里需要注意的是,实际抽取的具体号取决于表达式的逻辑关系[^4]。 #### Spark 集成 对于更复杂的析需求,可借助 Apache Spark 来读取 Hive 表并实施高效的无 shuffle Join 操作。这通常涉及到调整 Spark 应用程序的相关属性以匹配底层存储结构[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值