一起学Hive——详解四种导入数据的方式

在使用Hive的过程中,导入数据是必不可少的步骤,不同的数据导入方式效率也不一样,本文总结Hive四种不同的数据导入方式: 从本地文件系统导入数据 从HDFS中导入数据 从其他的Hive表中导入数据 创建表的同时导入数据 使用导入数据时,会使用到into和overwrite into两个关键字,into是在当前表追加数据,而overwrite into是删除当前表的数据然后在导入数据。 从本地系统导入数据 在Hive中创建load_data_local表,该表中有两个字段,一个是name一个是age。创建表的SQL语句如下: create table if not exists load_data_local(name string,age int) row format delimited fields terminated by ' ' lines terminated by '\n'; 在本地文件系统中创建一个load_data_local.txt的文件,然后往里面写入数据,数据之间用空格分隔。数据为: zhangsan 30 lisi 50 wangwu 60 peiqi 6 执行load data local inpath '/home/hadoop/hive_test/load_data_local.txt' into table load_data_local;命令,即可将本地系统中的文件的数据导入到Hive表中。 在使用从本地系统导入数据大Hive表中时,文件的路径必须使用绝对路径。 有两种方式验证数据是否导入成功,一种是在Hive中执行select * from load_data_local。另外一种是查看hdfs文件系统中的load_data_local目录下面是否有刚刚上传的load_data_local.txt文件,查看命令为:hadoop fs -ls /user/hive/warehouse/bigdata17.db/load_data_local,结果为: 18/10/07 02:37:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items -rwxr-xr-x 3 root supergroup 38 2018-10-07 02:24 /user/hive/warehouse/bigdata17.db/load_data_local/load_data_local.txt 从HDFS中导入数据 在Hive中创建load_data_hdfs表,表中有两个字段,分别是name和age。创建表的SQL如下: create table if not exists load_data_hdfs(name string,age int) row format delimited fields terminated by ' ' lines terminated by '\n'; 在本地文件系统创建文件load_data_hdfs.txt文件,然后往里面写入数据。 将load_data_hdfs.txt文件上传到HDFS的data目录下面,命令为:hadoop fs -put load_data_hdfs.txt /data 在Hive中执行命令: load data inpath 'data/load_data_hdfs.txt' into table load_data_hdfs; 即可将数据导入到Hive的load_data_hdfs表中。 从本地系统导入数据和从hdfs文件系统导入数据用的命令都是load data,但是从本地系统导入数据要加local关键字,如果不加则是从hdfs文件系统导入数据。 从hdfs文件系统导入数据成功后,会把hdfs文件系统中的load_data_hdfs.txt文件删除掉。 从其他的Hive表中导入数据 这种方式要求目标表和源表都必须存在。 创建一个要导入数据的目标表,SQL如下: create table if not exists load_data_local2(name string,age int) row format delimited fields terminated by ' ' lines terminated by '\n'; 导入数据的SQL: insert into table load_data_local2 select * from load_data_local; 这种数据导入方式也适用于分区表和分桶表的情况。本文只介绍导入分区表的情况,导入数据到分区表分为静态分区和动态分区两种方式。 我们先创建一个分区表,SQL如下: create table if not exists load_data_partition(name string) partitioned by(age int) row format delimited fields terminated by ' ' lines terminated by '\n'; 将数据导入分区表必须先在Hive中执行下面两句语句: set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; 静态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下: insert into table load_data_partition partition(age=25) select name from load_data_local; 这种方式必须显示的指定分区值,如果分区有很多值,则必须执行多条SQL,效率低下。 动态方式将load_data_local表的数据导入到load_data_partition表的sql语句如下: insert overwrite table load_data_partition partition select name,age from load_data_local; 这种方式要注意目标表的字段必须和select查询语句字段的顺序和类型一致,特别是分区字段的类型要一致,否则会报错。 一张表有两个以上的分区字段,如果同时使用静态分区和动态分区导入数据,静态分区字段必须写在动态分区字段之前。 Hive还支持一条SQL语句中将数据插入多个表的功能,只需将from关键字前置即可: from load_data_local insert overwrite table load_data_partition partition (age) select name,age insert overwrite table load_data_local3 select * 上面的sql语句同时插入到表load_data_partition和load_data_local3表中。这种方式非常高效,对于大数据量并且要将数据插入到多个表的情况下,建议用这种方式。 创建表的同时导入数据 这种方式的创建表的表结构来自于select查询语句的查询字段。 创建load_data_local3并将load_data_loaca的数据导入到load_data_local3表中: create table load_data_local3 as select * from load_data_local; 用心写好每篇技术文章 作者:Summer哥 出处:www.bigdata17.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 关注本人的公众号获取更多关于大数据和机器学习方面的知识 https://www.cnblogs.com/airnew/p/9752342.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信