任务描述
本关任务:将文档中的数据导入到数据库的表中。
相关知识
之前系列实训中我们接触过导入本地文件到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 shoppingLOCATION '/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
表结构:
INFO | TYPE |
Sno |
INT |
name |
STRING |
age |
INT |
sex |
STRING |
score |
STRUCT <Chinese:FLOAT,Math:FLOAT,English:FLOAT> |
本地文件/home/student.txt
的内容为:
- 创建数据库
test1
; - 切换到
test1
数据库; - 在
test1
中创建相应格式的表student
(未分区),表结构如上所示,分隔符根据/home/student.txt
的内容设置; - 将
/home/student.txt
的数据导入到表student
中。
按照以上要求填写命令。每个要求对应一条命令,共4条命令,以;隔开。(请勿删除代码框架) 由于hive启动时间较长,测评时请耐心等待,大概需要时间:60s左右。
测试说明
平台会对你编写的命令进行测试:
若操作成功,会显示如下信息:
导入数据后student表中的数据为: 1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5} 2 Xiaoliang 17 male {"chinese":95.0,"math":88.0,"english":93.5} 3 Xiaoming 19 male {"chinese":86.5,"math":98.0,"english":91.0} 4 Xiaoguang 18 male {"chinese":88.0,"math":80.0,"english":94.0} 5 Xiaohua 16 female {"chinese":97.0,"math":58.5,"english":88.0} /hive/test1 下的目录结构为: /hive/test1/student /hive/test1/student/student.txt
开始你的任务吧,祝你成功!
/********* 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;