开发者学堂课程【大数据Hive教程精讲:Apache Hive--DML--insert&多重插入&动态分区】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/90/detail/1376
Apache Hive--DML--insert&多重插入&动态分区
简介:
1. Lnsert
2. Multi lnserts多重插入
3. Dynamic partition inserts动态分区插入
Lnsert:
Hive中 insert 主要是结合 Select 查询语句使用,将查询结果插入到表中,例如:insert overwrite table stu_buck
select * from student cluster by(Sno);
需要保证查询结果列的数目和需要插入数据表格的列数目一致.
如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为 NULL。
可以将一个表查询出来的数据插入到原表中,结果相当于自我复制了一份数据。
Multi lnserts多重插入:
from source_table
insert overwrite tabletablename1 [partition (partcol1=val1,partclo2=val2)]
select_statement1
insert overwrite tabletablename2 [partition (partcol1=val1,partclo2=val2)]
select_statement2..
Dynamic partition inserts动态分区插入:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)select_statement FROM from_statement
[root@node-1 hivedata]# rzrz waiting to receive.
starting zmodem transfer. Press ctr1+c to cance1.Transferring students.txt....
100% 526 bytes 526 bytes/sec 00:00:01 o Errors
[root@node-1 hivedata]# hadoop fs -mkdir /stu
[root@node-1 hivedataj# hadoop fs -put students.txt /stu
[root@node-1 hivedata]# vi a
动态分区是通过位置来对应分区值的。原始表select出来的值和输出 partition的值的关系仅仅是通过位置来确定的,和名字并没有关系。
动态分区插入
set hive.exec.dynamic.partition=true;-#是否开启动态分区功能,默认false关闭。
set hive.exec.dynamic.partition.mode=nomstrict;动态分区的模式,默认strict,表示必须指定至少一个分区为静态
需求:
将dynamic_ partition_table中的数据按照时间(day),插入到目标表d p t的相应分区中。
原始表:
create table dynamic_partition_table(day string, ip string)row format delimited fields terminated by " ,";
load data local inpath '/root/hivedata/dynamic _partition_table.txt' into table dynamic partition_table;
2015-05-10,ip1
2015-05-10,ip2
2015-06-14,ip3
2015-06-14,ip4
2015-06-15,ip1
2015-06-15,ip2
目标表:
create table d_p_t(ip string) partitioned by (month string,day string);
动态插入:
insert overwrite table d_p_t partition (month, day)
select ip, substr (day,1,7) as month, day
from dynamic partition_table;
查询结果导出到文件系统
3、将查询结果保存到指定的文件目录(可以是本地,也可以是hdfs)insert overwrite local directory '/home/hadoop/test'
select * from t_p;