本文介绍如何将文件中的数据导入Hive表中。
将文件中的数据导入Hive中要使用Load关键字,具体完整语法如下,[ ]中的均为可选项:
load data [local] inpath 'filepath' [overwrite]
into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。
filepath 可以是:
相对路径,例如:project/data1
绝对路径,例如: /user/hive/project/data1
包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
如果指定了 LOCAL,那么:
load 命令会去查找本地文件系统中的 filepath,并将 filepath 中的文件复制到目标文件系统中。
如果发现filepath是相对路径,则路径会被解释为相对于当前用户的当前路径。
用户也可以为本地文件指定一个完整的 URI,比如:file:///user/hive/project/data1,建议使用绝对路径。
如果没有指定 LOCAL 关键字,那么会去查找HADOOP分布式文件系统(HDFS)中的 filepath,一般不使用,有兴趣的同学自行百度即可。
语法如下:
load data local inpath 'filepath' [overwrite]
into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。
语法如下:
load data [local] inpath 'filepath' overwrite
into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名。
如果要插入数据的目标表没有分区,语法如下:
load data [local] inpath 'filepath' [overwrite]
into table tablename
如果要插入数据的目标表有分区,必须指定具体的分区,语法如下:
load data [local] inpath 'filepath' [overwrite]
into table tablename partition (partcol1=val1, partcol2=val2 ...)
这里我来示范将三个位于Linux本地文件系统的csv文件导入表t_od_use_cnt的三个分区中,注意建表时要使用前文中以英文逗号分隔的建表语句,因为csv文件的列间隔符是逗号。如果导入以tab为间隔的txt文件,建表时以‘\t’作为间隔符。
1.首先下载三个csv文件
百度网盘:链接:https://pan.baidu.com/s/1lNO6r4-qCtqbyoYK7FIhVQ
提取码:wvg9
2. 建立一个存放数据文件的目录
命令如下:
mkdir -p /root/hive_practice_data/t_od_use_cnt
3. 上传文件至该目录中
在左边找到下载的三个csv文件,右边进入新建的目录/root/hive_practice_data/t_od_use_cnt中。
选中三个csv文件,右键点击Transfer
成功后效果如下:
回到命令行界面查看新导入的文件
[root@hadoop ~]# cd hive_practice_data/t_od_use_cnt
[root@hadoop t_od_use_cnt]# ll
total 72
-rw-r--r-- 1 root root 17848 May 4 17:33 20190101.csv
-rw-r--r-- 1 root root 23166 May 4 17:33 20190102.csv
-rw-r--r-- 1 root root 26750 May 4 17:33 20190103.csv
[root@hadoop t_od_use_cnt]# head 20190101.csv
1,1.5,10000,6,1
2,1.3,10001,49,1
2,1.5,10002,23,1
2,1.2,10003,1,0
1,1.2,10004,29,1
1,1.5,10005,15,1
2,1.4,10006,12,1
1,1.2,10007,40,1
1,1.3,10008,25,1
1,1.1,10009,40,1
[root@hadoop t_od_use_cnt]# head 20190102.csv
1,1.4,10200,46,1
1,1.3,10201,13,1
2,1.2,10202,31,1
1,1.5,10203,18,1
2,1.2,10204,30,1
1,1.3,10205,47,1
1,1.4,10206,39,1
2,1.4,10207,46,1
2,1.2,10208,26,1
1,1.5,10209,39,1
[root@hadoop t_od_use_cnt]# head 20190103.csv
2,1.2,10400,40,1
2,1.3,10401,28,1
1,1.2,10402,32,1
1,1.2,10403,41,1
2,1.2,10404,5,1
2,1.4,10405,50,1
2,1.1,10406,24,1
1,1.5,10407,50,1
1,1.4,10408,3,0
1,1.4,10409,5,1
[root@hadoop t_od_use_cnt]#
4. 启动Hive,将三个csv文件分别导入表t_od_use_cnt的三个对应的时间分区中,命令如下:
load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190101.csv'
into table t_od_use_cnt partition (date_8=20190101);
load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190102.csv'
into table t_od_use_cnt partition (date_8=20190102);
load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190103.csv'
into table t_od_use_cnt partition (date_8=20190103);
若插入成功,运行效果如下:
hive> load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190101.csv'
> into table t_od_use_cnt partition (date_8=20190101);
Loading data to table app.t_od_use_cnt partition (date_8=20190101)
Partition app.t_od_use_cnt{date_8=20190101} stats: [numFiles=1, numRows=0, totalSize=17848, rawDataSize=0]
OK
Time taken: 3.748 seconds
hive> load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190102.csv'
> into table t_od_use_cnt partition (date_8=20190102);
Loading data to table app.t_od_use_cnt partition (date_8=20190102)
Partition app.t_od_use_cnt{date_8=20190102} stats: [numFiles=1, numRows=0, totalSize=23166, rawDataSize=0]
OK
Time taken: 1.801 seconds
hive> load data local inpath '/root/hive_practice_data/t_od_use_cnt/20190103.csv'
> into table t_od_use_cnt partition (date_8=20190103);
Loading data to table app.t_od_use_cnt partition (date_8=20190103)
Partition app.t_od_use_cnt{date_8=20190103} stats: [numFiles=1, numRows=0, totalSize=26750, rawDataSize=0]
OK
Time taken: 0.727 seconds
hive>
5. 使用select语句查看插入表中的数据
这里需要使用select查询语句验证数据是否成功插入,具体语法会在后续博文中介绍。这里分别查询每个分区的前5条数据,命令如下:
select * from t_od_use_cnt where date_8 = 20190101 limit 5;
select * from t_od_use_cnt where date_8 = 20190102 limit 5;
select * from t_od_use_cnt where date_8 = 20190103 limit 5;
运行效果如下:
hive> select * from t_od_use_cnt where date_8 = 20190101 limit 5;
OK
1 1.5 10000 6 1 20190101
2 1.3 10001 49 1 20190101
2 1.5 10002 23 1 20190101
2 1.2 10003 1 0 20190101
1 1.2 10004 29 1 20190101
Time taken: 2.129 seconds, Fetched: 5 row(s)
hive> select * from t_od_use_cnt where date_8 = 20190102 limit 5;
OK
1 1.4 10200 46 1 20190102
1 1.3 10201 13 1 20190102
2 1.2 10202 31 1 20190102
1 1.5 10203 18 1 20190102
2 1.2 10204 30 1 20190102
Time taken: 0.236 seconds, Fetched: 5 row(s)
hive> select * from t_od_use_cnt where date_8 = 20190103 limit 5;
OK
2 1.2 10400 40 1 20190103
2 1.3 10401 28 1 20190103
1 1.2 10402 32 1 20190103
1 1.2 10403 41 1 20190103
2 1.2 10404 5 1 20190103
Time taken: 0.217 seconds, Fetched: 5 row(s)
hive>
能看到这里的同学,就右上角点个赞顺便关注我吧,3Q~