hive补0吗 insert into hive insert into values语句_hive replace替换多个

既然Hive没有行级别的数据插入、数据更新和删除操作,那么往表中装载数据的唯一途径就是使用一种“大量”的数据装载操作。或者通过其他方式仅仅将文件写入到正确的目录下。

第一种方式之前介绍过了,LOAD,一条命令一笔带过

LOAD DATA LOCAL INPATH /data/ OVERWRITE INTO TABLE ods_login PARTITION (dt='2020-03-01');

第二种方式通过查询语句向表中插入数据

INSERT语句允许用户通过查询语句向目标表中插入数据。依旧使用前章中表 ods_login作为例子,假设我们的ods_login已经通过load有数据了,数仓的下一层是dwd,那么我们需要将数据从ods_login写入到dwd_login,像这样(省略掉数据清洗逻辑)

INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200302')SELECT * FROM ods_loginWHERE dt='20200302'

这里使用了 OVERWRITE关键字,因此之前分区中的内容(如果是非分区表,就是之前表中的内容)将会被覆盖掉。这里如果没有使用OVERWRITE关键字或者使用INTO关键字替换掉它的话,那么Hive 将会以追加的方式写入数据而不会覆盖掉之前已经存在的内容。

单个査询语句中创建表并加载数据

用户同样可以在一个语句中完成创建表并将查询结果载入这个表的操作:

CREATE TABLE dwd_loginAS SELECT name, salary, addressFROM ods_loginWHERE date='20200302'

这张表只含有dwd_login表中name、salary和address3个字 段的信息。新表的模式是根据SELECT语句来生成的。

使用这个功能的常见情况是从一个大的宽表中选取部分需要的数据集。

这个功能不能用于外部表。可以回想下使用ALTER TABLE语句可以为外部表“引用” 到一个分区,这里本身没有进行数据“装载”,而是将元数据中指定一个指向数据的 路径。

然而,如果表ods_login非常大,而且需要从这个表中不同字段的数据做不同的处理,然后写入不同的表中的话,就没有那么简单了。好在 Hive提供了另一种INSERT语法, 即只扫描一次输入数据,然后按多种方式进行划分。如下:

FROM ods_loginINSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200302')SELECT * WHERE event=‘login’ and dt=‘20200302’INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200303')SELECT * WHERE event=‘login’ and dt=‘20200303’INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200304')SELECT * WHERE event=‘login’ and dt=‘2020030

从ods_login表中读取的每条 记录都会经过一条SELECT ... WHERE ...句子进行判断。这些句子都是独立进行判断的,不是 IF...THEN...ELSE...结构

事实上,通过使用这个结构,源表中的某些数据可以被写入目标表的多个分区中或者不被写入任一个分区中。

如果某条记录是满足某个SELECT ... WHERE ...语句的话,那么这条记录就会被写入 到指定的表和分区中。简单明了地说,每个INSERT子句,只要有需要,都可以插入 到不同的表中,而那些目标表可以是分区表也可以是非分区表。

因此,输入的某些数据可能输出到多个输出位置而其他一些数据可能就被删除掉了。当然,这里可以混合使用INSERT OVERWRITE句式和INSERT INTO句式。

参考资料:

1.《Hive编程指南》 

2. Hive官方wiki:

https://cwiki.apache.org/confluence/display/HIVE