Hive-分桶

分桶

单个分区或者表中的数据越来越大,分区不能细粒度的划分数据时,可以采用分桶去实现,
分桶是将数据集分解为更容易管理的若干部分的另一种技术

分桶的技术:

CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

分桶的原理:

跟MR的hashpartitioner是一样的
MR中:key的hash值模上reduce数量
hive中:按照分桶字段的hash值模上分桶的个数
hive也是针对某一列进行桶的组织,hive采用对列值进行hash,然后模上分桶的个数求余数决定记录存放在哪儿个桶中

分桶的意义

1、为了保存分桶查询的分桶结构(数据已经按照分桶字段进行了hash散列)
2、分桶表进行抽样和join操作时可以提高MR的查询效率

### 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、付费专栏及课程。

余额充值