Hive 建表集合

本文介绍了Hadoop大数据处理中创建简单表、外部表、分区表以及Bucket表的SQL语法。从基本的CREATE TABLE语句到复杂的分区和桶设置,详细阐述了每种类型表的用途和格式,包括存储格式、字段分隔符和位置。此外,还提及了如何创建带有索引字段的表以及复制空表的操作,为大数据环境下的数据管理提供了清晰的指导。
  • 创建简单表:
CREATE TABLE pokes (foo INT, bar STRING);
  • 创建外部表:
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User',
country STRING COMMENT 'country of origination')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
STORED AS TEXTFILE
LOCATION '<hdfs_location>';
  • 建分区表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
ROW FORMAT DELIMITED ‘\’
FIELDS TERMINATED BY '\'
STORED AS SEQUENCEFILE;
  • 建Bucket表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED ‘\’
FIELDS TERMINATED BY '\'
STORED AS SEQUENCEFILE;
  • 创建表并创建索引字段
CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
  • 复制一个空表
CREATE TABLE empty_key_value_store
LIKE key_value_store;

<think>我们正在查询Hive语句的详细参数。根据引用[1][2][3],以下是Hive语句的详细参数说明: ### 1. **基础语法结构** ```sql CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS ] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] [WITH DBPROPERTIES (property_name=property_value, ...)] ``` --- ### 2. **关键参数详解** #### (1) `EXTERNAL` —— 定义类型 - **内部(默认)**: 数据由Hive管理,删除时**同时删除元数据和HDFS数据**。 - **外部**: 仅管理元数据,删除时**只删除元数据,不删除HDFS数据**[^2][^3]。 需用 `LOCATION` 指定数据路径(通常用于共享数据)。 **语法**:`CREATE EXTERNAL TABLE ... LOCATION '/path';` #### (2) `PARTITIONED BY` —— 分区 - **作用**:将按指定列的值划分目录(如按日期分区),显著提升查询效率。 - **规则**: - 分区列**不能是字段**(物理存储为子目录) - 支持多级分区(如 `PARTITIONED BY (dt STRING, hour STRING)`) **示例**: ```sql PARTITIONED BY (dt STRING) -- 按日期分区 ``` #### (3) `CLUSTERED BY` + `SORTED BY` —— 分桶与排序 - **分桶(CLUSTERED BY)**: 根据哈希值将数据分散到固定数量的桶中,优化JOIN和采样。 **语法**:`CLUSTERED BY (user_id) INTO 32 BUCKETS` - **桶内排序(SORTED BY)**: 每个桶内按指定列排序(**非全局排序**)。 **语法**:`SORTED BY (log_time DESC)` #### (4) `ROW FORMAT` —— 数据行格式 - **作用**:定义字段和行的分隔符。 - **常用格式**: ```sql ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' -- 字段分隔符(如制符) LINES TERMINATED BY '\n' -- 行分隔符(默认\n) COLLECTION ITEMS TERMINATED BY ',' -- 集合元素分隔符(如数组) MAP KEYS TERMINATED BY ':' -- Map键值对分隔符 ``` 或使用SerDe(序列化/反序列化): ```sql ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' ``` #### (5) `STORED AS` —— 文件存储格式 | 格式 | 说明 | 适用场景 | |------------|--------------------------|------------------------| | `TEXTFILE` | 默认文本格式 | 兼容性好,但性能低 | | `ORC` | 列式存储,高压缩比 | OLAP分析 | | `PARQUET` | 列式存储,跨平台 | Spark/Hive通用场景 | | `AVRO` | 支持Schema演化 | 数据结构频繁变更 | | `SEQUENCEFILE` | Hadoop二进制格式 | 已逐渐被ORC/Parquet替代 | **示例**: ```sql STORED AS ORC -- 使用ORC格式 ``` #### (6) `LOCATION` —— 指定HDFS路径 - 内部:默认路径为 `/user/hive/warehouse/<db>.db/<table>` - 外部:**必须显式指定路径**,如: ```sql LOCATION '/user/data/logs' -- HDFS绝对路径 ``` #### (7) `TBLPROPERTIES` —— 属性配置 - **作用**:设置元数据属性或优化参数。 - **常用属性**: | 属性名 | 说明 | |----------------------------------|-------------------------------| | `'orc.compress'='ZLIB'` | ORC压缩算法(ZLIB/SNAPPY)[^1] | | `'auto.purge'='true'` | 删除时立即清空数据 | | `'comment'='log table'` | 补充注释 | | `'transactional'='true'` | 启用ACID事务(需ORC格式) | **示例**: ```sql TBLPROPERTIES ( 'orc.compress'='SNAPPY', 'auto.purge'='true' ) ``` #### (8) `WITH DBPROPERTIES` —— 数据库级属性 - **作用**:存储数据库描述信息(较少使用)。 ```sql WITH DBPROPERTIES ('creator'='admin', 'date'='2024-01-01') ``` --- ### 3. **完整示例** ```sql CREATE EXTERNAL TABLE user_logs ( user_id STRING COMMENT '用户ID', action STRING COMMENT '行为类型' ) COMMENT '用户行为日志' PARTITIONED BY (dt STRING COMMENT '日期分区') CLUSTERED BY (user_id) INTO 64 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS ORC LOCATION '/data/logs/user' TBLPROPERTIES ( 'orc.compress'='ZLIB', 'auto.purge'='false' ); ``` --- ### 4. **注意事项** 1. **字段类型匹配**:分区列和分桶列的数据类型需与字段区分。 2. **压缩算法选择**: - `ZLIB`:高压缩比,适合存储密集型场景 - `SNAPPY`:快速压缩,适合计算密集型场景 3. **外部保护**:删除外部**不会**删除数据,避免误删生产数据。 --- ### 相关问题 1. Hive内部和外部在数据管理机制上有何本质区别? 2. ORC和Parquet列式存储格式在Hive中的性能对比如何? 3. 如何为Hive的分区字段选择合适的数据类型? 以上内容基于引用[1][2][3]的Hive规范整理,具体配置需结合实际业务需求调整[^1][^2][^3]。 </think> ### Hive语句详细参数解析 以下基于引用内容[1][2][3]整理,按语法结构分类说明: --- #### 一、基础结构参数 1. **`[EXTERNAL]`** - 创**外部**(默认创内部) - **关键区别**: - 内部:删除时**同时删除元数据和HDFS数据** - 外部:删除时**仅删除元数据,保留HDFS数据**[^2] - 外部必须指定:`LOCATION 'hdfs_path'` 2. **`[IF NOT EXISTS]`** - 不存在时才创,避免重复报错 --- #### 二、数据定义参数 3. **列定义** ```sql (col_name data_type [COMMENT col_comment], ...) ``` - `data_type`:支持 `INT`, `STRING`, `ARRAY<STRING>`, `MAP<STRING,INT>` 等 - `COMMENT`:字段注释(元数据信息) 4. **`COMMENT table_comment`** - 整张的描述信息 --- #### 三、物理存储参数 5. **`PARTITIONED BY (col_name data_type, ...)`** - 创**分区**(如按日期分区) - 分区列**不能是已定义的字段**(物理存储为子目录) - 示例:`PARTITIONED BY (dt STRING)`[^2] 6. **`CLUSTERED BY (col_name) INTO num_buckets BUCKETS`** - 分桶(哈希散列),优化JOIN和采样 - 可选排序:`SORTED BY (col_name [ASC|DESC])` 7. **`ROW FORMAT DELIMITED`** - 文本格式分隔符定义: ```sql FIELDS TERMINATED BY '\t' -- 列分隔符 LINES TERMINATED BY '\n' -- 行分隔符 ``` 8. **`STORED AS file_format`** | 格式 | 特点 | |---------------|-------------------------------| | `TEXTFILE` | 默认文本格式(可读性好) | | `ORC` | 列式存储+高压缩(推荐) | | `PARQUET` | 列式存储(跨平台兼容) | | `AVRO` | 支持Schema演化 | 9. **`LOCATION 'hdfs_path'`** - 指定数据在HDFS的存储路径 - **外部必须显式指定** --- #### 四、高级属性参数 10. **`TBLPROPERTIES (key=value, ...)`** - 级别元数据配置: ```sql TBLPROPERTIES ( 'orc.compress'='ZLIB', -- ORC压缩算法(ZLIB/SNAPPY) 'auto.purge'='true', -- 删除时立即清空数据 'transactional'='true' -- 启用ACID事务(需ORC格式) ) ``` 11. **`WITH DBPROPERTIES (key=value)`** - 数据库级属性(较少使用) --- ### 完整示例 ```sql CREATE EXTERNAL TABLE user_logs ( user_id BIGINT COMMENT '用户ID', action STRING COMMENT '行为类型' ) COMMENT '用户行为日志' PARTITIONED BY (dt STRING) -- 按日期分区 CLUSTERED BY (user_id) INTO 32 BUCKETS -- 分桶 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS ORC -- ORC列式存储 LOCATION '/data/logs/user' -- HDFS路径 TBLPROPERTIES ( 'orc.compress'='ZLIB', -- 启用ZLIB压缩 'auto.purge'='true' ); ``` --- ### 关键注意事项 1. **内部 vs 外部** - 临时数据用**内部**(自动管理数据) - 共享数据用**外部**(避免误删原始数据) 2. **压缩算法选择** - `ZLIB`:高压缩比(存储优化) - `SNAPPY`:快速压缩(查询优化) 3. **分区与分桶** - 分区:按**低基数**字段划分(如日期、地区) - 分桶:按**高基数**字段散列(如用户ID) --- ### 相关问题 1. Hive 内部和外部在数据删除场景下有何本质区别? 2. 如何为分区动态添加新分区并加载数据? 3. ORC 和 Parquet 列式存储格式在 Hive 中的性能对比如何? > 以上参数说明基于 Hive 标准语法[^1],具体行为可能因版本差异略有不同。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mylife512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值