导入数据到Hive表中有4种方式:使用HDFS文件管理命令复制/移动文件到Hive表数据存放目录,使用LOAD DATA
命令,使用INSERT INTO TABLE tablename SELECT ...
语句和使用CREATE TABLE tablename AS SELECT ...
语句。
根据《Hadoop:The Definitive Guide 4th Edition》Chapter 17 Hive——A部分可知,Hive表数据与HDFS文件是对应的,因此,可以使用HDFS文件管理命令将文件直接复制/移动到Hive表数据存放目录,从而达到将数据导入相应Hive表的目的。
使用如下命令,建立一个Hive表user:
CREATE TABLE user(id INT,name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
现有一个文件“a.txt”,内容如下所示:
1 Tommy
2 Alice
3 Jim
通过以下命令将“a.txt”文件直接复制到表对应的数据存放目录:
hadoop fs -put a.txt /user/hive/warehouse/user/
通过以下语句查询user表内容,可得如图1所示结果,证明数据导入操作成功。
SELECT * FROM user
通过以下命令复制一份“a.txt”文件:
hadoop fs -cp /user/hive/warehouse/user/a.txt /user/hive/warehouse/user/b.txt
此时再次执行查询命令,可得如图2所示结果。
LOAD DATA
命令HiveQL中提供LOAD DATA
命令,用于导入数据到Hive表中。根据导入文件是在本地,还是在HDFS文件系统上,LOAD DATA
命令,又可分为LOAD DATA LOCAL INPATH
和LOAD DATA INPATH
。
以上面提及到的表和文件为对象,进行举例说明。
首先执行hadoop fs -rm /user/hive/warehouse/user/*
语句,清空user表数据存放目录下的所有数据。
接下来执行LOAD DATA
命令导入数据。具体命令如下:
LOAD DATA LOCAL INPATH 'a.txt' INTO TABLE user
此时通过表数据查询命令,可以得到如图3所示的表内容。
图3
假定在HDFS文件系统目录“/user”下有一个“b.txt”文件,它的内容如下所示:
4 dsl
如果执行如下命令,可以发现表内容如图4所示。
LOAD DATA INPATH '/user/b.txt' INTO TABLE user
INSERT INTO TABLE tablename SELECT ...
语句可以从其他表获取数据插入到当前表中,具体是使用INSERT INTO TABLE tablename SELECT ...
语句。
首先使用如下命令创建一个新的Hive表userlog。
CREATE TABLE userlog(id INT,name STRING)
接着使用如下命令从以上提及到的user表中获取数据插入userlog表中。
INSERT INTO TABLE userlog SELECT id,name FROM user
最后userlog表内容如图5所示。
CREATE TABLE tablename AS SELECT ...
语句可以在创建Hive表的同时从其他表获取数据进行填充。比如执行如下语句,表示创建了一个新的Hive表,同时从上述提及到的user表中获取数据进行了填充。
CREATE TABLE personlog AS SELECT id,name FROM user
此时,新的Hive表内容如图6所示。