在 Hive 中,“建索引”和传统的 MySQL 等关系型数据库不太一样。Hive 早期版本支持 INDEX,但 Hive 3.x 已不推荐使用索引,官方更推荐用 分区(Partition) 和 分桶(Bucket) 来优化查询性能。
下面分几种情况说明:
CREATE INDEX idx_user_id
ON TABLE user_table (user_id)
AS 'COMPACT'
WITH DEFERRED REBUILD;
ALTER INDEX idx_user_id ON user_table REBUILD;
DROP INDEX idx_user_id ON user_table;
⚠️ 注意:
✅ 最常用、最有效
CREATE TABLE user_log (
user_id STRING,
action STRING
)
PARTITIONED BY (dt STRING);
插入数据:
INSERT INTO user_log PARTITION (dt='2024-01-01')
SELECT user_id, action FROM source_table;
查询时只扫描指定分区:
SELECT * FROM user_log WHERE dt='2024-01-01';
适合 JOIN、采样
CREATE TABLE user_info (
user_id STRING,
name STRING
)
CLUSTERED BY (user_id)
INTO 10 BUCKETS;
要求:
SET hive.enforce.bucketing=true;
| 需求 | 推荐方式 |
|---|---|
| 按时间/地区查询 | 分区 |
| 大表 JOIN | 分桶 |
| 精确过滤某列 | ORC + 谓词下推 |
| 替代索引 | 分区 + 分桶 |
Hive 不要想着“建索引”,要想“怎么分区、怎么分桶”。
如果你能说下:
我可以帮你设计最合适的存储方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。