Hive的insert操作

insert 语法格式为:


1. 基本的插入语法:

insert overwrite table tablename [partition(partcol1=val1,partclo2=val2)] select_statement;

insert into table tablename [partition(partcol1=val1,partclo2=val2)] select_statement;

eg:

insert overwrite table test_insert select * from test_table;
insert into table test_insert select * from test_table;

注:
overwrite重写,into追加。


2. 对多个表进行插入操作:

from source_table
insert overwrite table tablename1 [partition (partcol1=val1,partclo2=val2)] select_statement1
insert overwrite table tablename2 [partition (partcol1=val1,partclo2=val2)] select_statement2

eg:

from test_table                    
insert overwrite table test_insert1
select key
insert overwrite table test_insert2
select value;

注:hive不支持用insert语句一条一条的进行插入操作,也不支持update操作。数据是以load的方式加载到建立好的表中,数据一旦导入就不可以修改。


2.通过查询将数据保存到filesystem

insert overwrite [local] directory 'directory' select_statement;

eg:

(1)导入数据到本地目录:

insert overwrite local directory '/home/hadoop/data' select * from test_insert1;

产生的文件会覆盖指定目录中的其他文件,即将目录中已经存在的文件进行删除。

只能用overwrite,into错误!

(2)导出数据到HDFS中:

insert overwrite directory '/user/hive/warehouse/table' select value from test_table;
只能用overwrite,into错误!

(3)同一个查询结果可以同时插入到多个表或者多个目录中:

from source_table
insert overwrite local directory '/home/hadoop/data' select *
insert overwrite directory '/user/hive/warehouse/table' select value;


3. 小结:

(1)insert命令主要用于将hive中的数据导出,导出的目的地可以是hdfs或本地filesysytem,导入什么数据在于书写的select语句。

(2)overwrite与into:

insert overwrite/into table 可以搭配;

insert overwrite directory 可以搭配;






### Hive中如何正确使用INSERT OVERWRITE语句进行数据覆盖插入 Hive 提供了 `INSERT OVERWRITE` 语句,用于覆盖目标表或分区中的现有数据。与 `INSERT INTO` 不同,`INSERT OVERWRITE` 在插入数据前会先删除目标表或分区中的已有数据,然后再写入新的数据。这种操作适用于需要定期更新整个数据集或特定分区数据的场景[^1]。 #### 覆盖整个表的数据 如果目标表没有使用分区机制,`INSERT OVERWRITE` 会清空整个表的数据,并将新数据写入其中。例如: ```sql INSERT OVERWRITE TABLE sales_data SELECT * FROM temp_sales; ``` 执行该语句后,`sales_data` 表中原有的所有数据将被 `temp_sales` 表中的数据替换。 #### 覆盖特定分区的数据 在使用了分区的 Hive 表中,`INSERT OVERWRITE` 仅会重写指定分区的数据,而不会影响其他分区。例如,如果表 `sales_data` 按日期分区,可以按如下方式覆盖某一天的数据: ```sql INSERT OVERWRITE TABLE sales_data PARTITION (dt='2023-10-01') SELECT order_id, amount FROM temp_sales WHERE dt='2023-10-01'; ``` 此语句将 `temp_sales` 表中 `dt='2023-10-01'` 的数据写入 `sales_data` 表的对应分区,并替换该分区的原有内容[^1]。 #### 使用动态分区进行覆盖 在某些情况下,希望根据源数据的分区字段动态地覆盖目标表中的多个分区。此时可以启用 Hive 的动态分区功能。例如: ```sql SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; INSERT OVERWRITE TABLE sales_data PARTITION (dt) SELECT order_id, amount, dt FROM temp_sales; ``` 在这个例子中,Hive 会根据 `temp_sales` 表中的 `dt` 字段值自动识别目标分区,并对每个分区执行覆盖操作。 #### 注意事项 - **数据丢失风险**:由于 `INSERT OVERWRITE` 会清除目标数据,因此在执行前应确保数据已正确备份或确认操作的必要性。 - **性能影响**:对于大规模数据表或分区,覆盖操作可能涉及大量数据的删除和写入,应选择在系统负载较低时执行。 - **分区管理**:在使用分区表时,建议合理规划分区结构,以便高效地管理数据更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值