题目
Hive 建表语句的基本语法是什么?创建表时通常使用什么分隔符?有哪些注意事项?
答案
**基本语法**:
```
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] 表名 (
列名1 数据类型 [COMMENT '注释'],
列名2 数据类型,
...
)
[PARTITIONED BY (分区列 数据类型, ...)] -- 分区表
[CLUSTERED BY (列) INTO 分桶数 BUCKETS] -- 分桶表
[ROW FORMAT DELIMITED
FIELDS TERMINATED BY '分隔符' -- 字段分隔符
COLLECTION ITEMS TERMINATED BY '分隔符' -- 数组/Map元素分隔符
MAP KEYS TERMINATED BY '分隔符'] -- Map键值分隔符
[STORED AS 文件格式(如 ORC、Parquet)]
[LOCATION 'HDFS路径'] -- 外部表需指定路径
[TBLPROPERTIES (属性名=值, ...)];
```
**常用分隔符**:
- **字段分隔符**:`\t`(制表符)、`,`、`|`
- **集合分隔符**:`\002`(Ctrl+B)、`^`
- **Map键值分隔符**:`\003`(Ctrl+C)
**注意事项**:
1. **数据与分隔符匹配**:确保建表时指定的分隔符与数据文件实际使用的完全一致,否则会导致字段错位。
2. **外部表路径管理**:外部表删除时不删除数据,需手动维护 HDFS 路径。
3. **分区字段限制**:分区列不能是表中已定义的列,且通常为低基数字段(如日期)。
4. **存储格式选择**: ORC/Parquet:列式存储,适合查询优化;TextFile:默认格式,便于直接查看内容。
5. **字符转义**:若数据中包含分隔符,需使用转义字符(如 `\`)或自定义 SerDe 处理。
**示例**:创建按日期分区的日志表:
```
CREATE EXTERNAL TABLE logs (
ip STRING,
url STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/user/hive/logs';
```
