Hive-3 分区和分桶

本文详细介绍了Hive的分区和分桶概念,旨在提高数据处理效率。分区通过将大数据划分为小部分,便于快速分析。静态分区需手动指定分区字段值,而动态分区则能自动分配。分桶是对数据的进一步细化,相同属性值的数据会被放入相同桶中,有助于提高查询效率和实现更高效的采样。创建分桶表需开启相关属性并设置reduce个数,使用tablesample语句可以对分桶表进行抽样查询。

Hive分区

分区的目的:将大的数据分割成小数据,减少分析时的扫描量,提高效率。如:可以将数据按天分区,每天分析前一天的数据。
在这里插入图片描述

  • 创建分区表语法
    分区字段不能和表中字段重复
 create table score(s_id string, c_id string, s_score int) 
 partitioned by (month string) 
 row format delimited fields terminated by '\t';
  • 创建一个表带多个分区
create table score2 (s_id string,c_id string, s_score int) 
partitioned by (year string, month string, day string) 
row format delimited fields terminated by '\t';
  • 加载数据到分区表中去
load data local inpath '/hivedatas/score.csv' into table score 
partition (month='201806');;
  • 加载数据到多分区表中去
load data local inpath '/hivedatas/score.csv' into table score2 partition(year='2018', 
### 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]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值