
# 如何对insert overwrite自读自写场景进行优化
#### 场景说明
对于需要使用动态分区插入（使用历史分区更新）数据到目的表中，且和数据源表是同一张表时，由于直接在原表上执行insert overwrite可能会导致数据丢失或数据不一致的风险，建议先使用一个临时表来处理数据，再执行insert overwrite操作。
#### 操作步骤
假设存在如下一张表：
```
user_data(user_group int, user_name string, update_time timestamp);
```
其中**user_group**是分区列，需要根据已有数据，按更新时间进行排序，刷新用户组信息。操作步骤如下：
1. 在Hive Beeline命令行执行以下命令开启Hive动态分区： 
   **set hive.exec.dynamic.partition=true;**
   **set hive.exec.dynamic.partition.mode=nonstrict;**
   
   
2. 执行以下命令创建一个临时表，用于存储去重后的数据： 
   **CREATE TABLE** *temp_user_data* **AS**
   **SELECT \* FROM (**
   **SELECT \*,**
   **ROW_NUMBER() OVER(PARTITION BY user_group ORDER BY update_time DESC) as rank**
   **FROM user_data**
   **) tmp**
   **WHERE rank = 1;**
   
   
3. 执行以下命令使用临时数据作为数据源，并插入到目的表中： 
   **INSERT OVERWRITE TABLE** *user_data*
   **SELECT user_group, user_name, update_time**
   **FROM** *temp_user_data* **;**
   
   
4. 执行以下命令清理临时表： 
   **DROP TABLE IF EXISTS** *temp_user_data* **;**
   
   
 
