相关知识
之前系列实训中我们接触过导入本地文件到
Hive
表中,本关就进行导入的详细讲解。
为了完成本关任务,你需要掌握:1.导入命令语法,2.如何将本地
txt
文件导入到分区表中。
导入命令语法
Load
操作执行
copy/move
命令把数据文件
copy/move
到
Hive
表位于
HDFS
上的目录位置,并不会对数据内容执行格式检查或格式转换操作。
Load
命令语法为:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=vall,partcol2=val2 …)];
文件路径
filepath
可以是指向
HDFS
的相对路径或是绝对路径,也可以是指向本地文件系统(
Linux
文件系统)相对路径(当前工作目录)或绝对路径。
若
filepath
指向
HDFS
,
LOAD
执行的是
move
操作(即执行
LOAD
后
filepath
中的文件不再存在);若
filepath
指向本地文件系统,
LOAD
执行的是
copy
操作(即执行
LOAD
后
filepath
中的文件仍然存在),但需要指定
LOCAL
关键字。
若
filepath
指向一个文件,
LOAD
会
copy
或
move
相应的文件到表
tablename
;若
filepath
指向一个目录,
LOAD
会
copy
或
move
相应目录下的所有文件到表
tablename
。若创建表时指定了分区列,使用 LOAD 命令加载数据时也要为所有分区列指定特定值。
针对
LOAD
语句中指明
LOCAL
关键字,
INPATH
参数可以使用下述方式确定:
- Hive 会在本地文件系统中查找
filepath
- 用户可以设置
filepath
为文件绝对路径,如file:///user/hive/data
针对
LOAD
语句中未指明
LOCAL
关键字,
INPATH
参数可以使用下述方式确定:
- 若
filepath
为相对路径,Hive
会解析成为/user/<username>/filepath
filepath
未指定模式或文件系统类型(如hdfs://namenode:9000/
),Hive
会把${fs.default.name}
值作为Namenode URL
若语句带
OVERWRITE
关键字,目标表或分区中的原始数据会被删除,替换成新数据;若未指定
OVERWRITE
关键字,新数据会以追加的方式被添加到表中。
若表或分区中的任何一个文件与
filepath
中的任何一个文件同名,则表或分区中的同名文件会被
filepath
中的同名文件替换。
将本地txt文件导入到分区表中(例子)
- 创建数据库
shopping
:
CREATE DATABASE IF NOT EXISTS shopping
LOCATION '/hive/shopping';
- 假设在数据库
shopping
中有分区表items_info2
:
CREATE TABLE IF NOT EXISTS shopping.items_info2(
name STRING COMMENT 'item name',
price FLOAT COMMENT 'item price',
category STRING COMMENT 'item category',
brand STRING COMMENT 'item brand',
type STRING COMMENT 'item type',
stock INT COMMENT 'item stock',
address STRUCT <city:STRING, country:STRING, zip:INT> COMMENT 'item sales address')
COMMENT 'goods information table'
PARTITIONED BY (p_category STRING,p_brand STRING) //设置分区
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
TBLPROPERTIES ('creator'='Xiaoming','date'='2019-01-01');
- 如假设本地文件
/home/shoppings.txt
内容为:
字段间分隔符
,
根据表中设置FIELDS TERMINATED BY ','
确定的。如果表中设置FIELDS TERMINATED BY '\t'
,那么字段间就应该用Tab
键间隔开集合分隔符
-
根据表中设置COLLECTION ITEMS TERMINATED BY '-'
确定的。如果表中设置COLLECTION ITEMS TERMINATED BY ','
,那么字段间就应该用逗号,
键间隔开使用
LOAD
命令加载本地文件数据到items_info2
表相应的分区中(PARTITION
关键字指定内容):
load data local inpath '/home/shoppings.txt' overwrite into table items_info2
partition (p_category='shoes',p_brand='playboy');
- 执行
LOAD
命令后,Hive
会在 HDFS 的/hive/shopping/items2/
路径下创建目录p_category=shoes/p_brand=playboy/
,并且会把items_info.txt
文件复制到上述创建的目录下
编程要求
student
表结构:
INFOTYPE
Sno
INT
name
STRING
age
INT
sex
STRING
score
STRUCT <Chinese:FLOAT,Math:FLOAT,English:FLOAT>
本地文件
/home/student.txt
的内容为:
- 创建数据库
test1
;
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
- 切换到
test1
数据库;
mysql> use test1;
Database changed
- 在
test1
中创建相应格式的表student
(未分区),表结构如上所示,分隔符根据/home/student.txt
的内容设置; - 将
/home/student.txt
的数据导入到表student
中。
/********* Begin *********/
create database if not exists test1 location '/hive/test1';
use test1;
create table if not exists test1.student (
Sno int,
name string,
age int,
sex string,
score struct <Chinese:float, Math:float, English:float>
)
row format delimited
fields terminated by ','
collection items terminated by '-';
load data local inpath '/home/student.txt' overwrite into table student;
/********* End *********/
select * from student;
按照以上要求填写命令。每个要求对应一条命令,共4条命令,以;隔开。(请勿删除代码框架)
由于hive启动时间较长,测评时请耐心等待,大概需要时间:60s左右。
版权归原作者 是草莓熊吖 所有, 如有侵权,请联系我们删除。