Hive 静态分区&动态分区(含常见错误)

本文介绍了Hive中的静态分区和动态分区操作。静态分区包括创建分区表和导入数据,强调了列数匹配的重要性。动态分区部分提到,在严格模式下需至少一个静态分区列,并通过示例展示了如何创建动态分区表,同时指出在非严格模式下才能执行动态分区插入操作。最后,展示了成功的分区创建和数据加载结果。
静态分区

1.创建分区表

hive (wzj)> CREATE TABLE emp_partition(
          > empno int,
          > ename string,
          > job string,
          > mgr int,
          > hiredate string,
          > sal double,
          > comm double
          > ) 
          > PARTITIONED BY (deptno int)
          > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.099 seconds
hive (wzj)> 

2.导入数据

常见错误:列数不符,因为我们建的分区表中只有7个字段,而emp中有8个字段

hive (wzj)> INSERT OVERWRITE TABLE emp_partition PARTITION (deptno=10) select * from emp where deptno=10;
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different '10': Table insclause-0 has 7 columns, but query has 8 columns.
hive (wzj)> 

正确做法:

hive (wzj)> INSERT OVERWRITE TABLE emp_partition PARTITION (deptno=10) select empno,ename,job,mgr,hiredate,sal,comm   from emp where deptno=10;
Query ID = wzj_20191225145959_6edf4344-c6eb-44c4-aa7c-58ea021621f5
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1577150260007_0005, Tracking URL
<think> 我们正在讨论Hive分区表与动态分区静态分区的联系。根据引用内容,我们可以总结以下几点: 1. 分区表基础: - 分区表是通过一个或多个分区字段(如日期、地区等)将数据物理分割存储在HDFS上的表(如`/table/partition_key=value/`)[^3]。 - 创建分区表时,分区字段必须在表定义中声明(如`PARTITIONED BY (dt STRING)`)[^3]。 2. 静态分区动态分区的定义: - **静态分区**:在插入数据时**手动指定**分区值。例如: ```sql INSERT INTO TABLE sales PARTITION (sale_date='2023-01-01') VALUES (1001, 150.0); ``` - **动态分区**:根据插入数据的**某一列的值自动确定**分区。例如: ```sql INSERT INTO TABLE sales PARTITION (sale_date) SELECT product_id, amount, sale_date FROM raw_sales; ``` 此时,Hive会根据`SELECT`语句中`sale_date`列的实际值动态创建分区[^1][^2]。 3. 联系与区别: - **共同目标**:两者都是为了优化分区表的数据加载,利用分区裁剪提升查询性能[^4]。 - **适用场景**: - 静态分区适合分区值已知且批量导入固定分区的场景(如按天导入前一天数据)[^4]。 - 动态分区适合分区值来源于查询结果且不确定的场景(如按用户所属地区自动划分)[^1][^2]。 - **性能**:静态分区直接写入指定分区,效率更高;动态分区需扫描数据以确定分区,可能引发小文件问题[^4]。 4. **动态分区的配置**: - 启用动态分区:`SET hive.exec.dynamic.partition=true;` - 关闭严格模式(允许全动态分区):`SET hive.exec.dynamic.partition.mode=nonstrict;`[^1][^2] 5. **示例对比**: - 静态分区插入(明确分区值): ```sql INSERT INTO logs PARTITION (year=2023) SELECT id, message FROM raw_logs WHERE year=2023; ``` - 动态分区插入(自动推断分区): ```sql INSERT INTO logs PARTITION (year) SELECT id, message, year FROM raw_logs; ``` ### 总结关系 分区表是数据存储的物理划分方式;静态分区动态分区是向分区表**加载数据的两种策略**: 1. **静态分区**:人工预定义分区值,直接插入对应分区。 2. **动态分区**:根据数据内容自动创建分区并插入,更灵活但需额外配置[^1][^2][^4]。 §§相关问题§§ 1. Hive动态分区插入时如何避免小文件问题? 2. 静态分区动态分区在数据更新场景下的应用差异? 3. 如何监控Hive动态分区的性能? </think> ### Hive分区表与动态分区静态分区的联系 在Hive中,**分区表**是核心数据管理机制,而**静态分区**和**动态分区**是两种向分区表加载数据的策略。三者关系如下: #### 1. **分区表:数据存储的基础结构** 分区表通过指定**分区键**(如日期、地区)将数据物理分割到不同HDFS目录。例如: ```sql CREATE TABLE sales ( product_id INT, amount DOUBLE ) PARTITIONED BY (sale_date STRING); -- 分区键必须是表字段[^3] ``` - **优势**:查询时可通过分区裁剪(如`WHERE sale_date='2023-01-01'`) 仅扫描相关目录,大幅提升性能[^4]。 #### 2. **静态分区:显式指定分区值** - **工作原理**:插入数据时**手动指定**分区值,每条数据写入固定分区。 - **示例**: ```sql INSERT INTO TABLE sales PARTITION (sale_date='2023-01-01') VALUES (1001, 150.0); ``` - **特点**: - 适用于分区值明确且数据量固定的场景(如按天导入日志) - 性能更高(无需运行时计算分区路径)[^4] - 需为每个分区单独执行插入语句 #### 3. **动态分区:自动推断分区值** - **工作原理**:根据**SELECT语句的列值**自动创建分区并插入数据。 - **启用要求**: ```sql SET hive.exec.dynamic.partition=true; -- 启用动态分区 SET hive.exec.dynamic.partition.mode=nonstrict; -- 关闭严格模式[^1][^2] ``` - **示例**: ```sql INSERT INTO TABLE sales PARTITION (sale_date) SELECT product_id, amount, sale_date FROM raw_table; ``` - **特点**: - 适用于分区值不确定或数量多的场景(如按用户地区自动分区) - 灵活性高,单次插入可生成多个分区 - 性能开销较大(需扫描数据以确定分区)[^4] #### 4. **核心联系总结** | **特性** | **分区表** | **静态分区** | **动态分区** | |----------------|--------------------|---------------------------|---------------------------| | **角色** | 数据存储结构 | 数据加载策略 | 数据加载策略 | | **分区创建方式** | 建表时定义 | 插入时显式指定 | 根据数据列值自动推断 | | **性能** | 查询优化(分区裁剪)| 插入快,适合少量分区 | 插入慢,适合大量分区 | | **灵活性** | 固定分区键 | 低(需预知分区值) | 高(自动适应新分区值)[^4] | #### 5. **典型应用场景** - **静态分区**:定期导入固定分区的数据(如每日凌晨导入前一天日志)[^4] - **动态分区**: - 从非分区表迁移数据到分区表 - 按业务维度自动生成分区(如用户所属城市、产品类别)[^1][^2] > **关键配置**:动态分区需关闭严格模式(`nonstrict`)才能实现全动态分区。严格模式(`strict`)要求至少指定一个静态分区列[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值