DDL操作
Hive中的表如何与HDFS上文件中的数据产生映射关系?
在HDFS上创建映射文件
在node01上创建文件夹:mkdir hivedata
在hivedata中新建一个文件1.txt文件:
cd hivedata
vi 1.txt
在1.txt中编写如下数据
将1.txt文件上传到HDFS上的hivedata目录中
HDFS新建hivedata目录:hadoop fs -mkdir /hivedata
上传1.txt文件到hivedata目录:hadoop fs -put /root/hivedata/1.txt /hivedata
在Hive中创建映射表
在Hive的hello数据库中创建一张表
使用hello数据库:use hello;
创建t_user1表:create table t_user1(id int,name string,age int);
此时在HDFS上的/user/hive/warehouse路径下会生成一个hello.db的数据库,t_user1表在该文件夹下
建立表与文件的映射
操作:将HDFS上的1.txt文件赋值到t_user1表中去
命令:hadoop fs -cp /hivedata/1.txt /user/hive/warehouse/hello.db/t_user1
结果:在HDFS的t_user1文件夹下多出一个1.txt文件
在node02上查询表中数据,发现Hive感知到文件中的数据,但是数据没有解析出 来
原因:解析数据的时候,没有规定数据之间的分割符样式
解决办法:Hive映射数据,如果数据之间使用的不是默认分隔符,那么在创建表的时候需要指定分隔符样式
将t_user1表删除:drop table t_user1;
创建t_user1并指定分隔符
指定分隔符语句:row format delimited fields terminated by ',';
创表语句:create table t_user1(id int,name string,age int) row format delimited fields terminated by ',';
赋值文件到表中:hadoop fs -cp /hivedata/1.txt /user/hive/warehouse/hello.db/t_user1
在node02上查询表中数据:select * from t_user1;
此时发现,HDFS上文件数据与Hive表之间映射成功。
作用:映射关系一旦建立,就可以通过Hive来操作HDFS中结构化的数据,通过sql语句来操作MapReduce程序
如:查询1.txt文件中有多少条数据
执行sql:select count(*) from t_user1;
此时打开YRAN的web-ui界面,可以查看MR程序的运行
在Hive中能查询到结果
Hive数据类型&分隔符
Hive中数据类型除了可以使用传统数据库数据类型以外,还可以使用Hive自带的数据类型。并且在Hive中创建表格时需要指定分割符。
简单数据类型
建立Hive连接
利用客户端机器node02连接node01上的Hive服务
在HDFS上的hivedate目录下提交一个文件2.txt,在文件中编写如下内容
提交命令:hadoop fs -put 2.txt /hivedata
此时在HDFS上就存在一个文件2.txt
在Hive中创建表格,并让表格与2.txt文件之间产生映射关系
创建表
在创建表时,数据类型与传统数据类型大体一致,但是由于2.txt文件中数据之间以逗号分隔,所以在后期如果想要映射成功,在创建表格时需要指定分割符
创表语句
create table t_user2(id int,name string,score int) row format delimited fields terminated by ',';
建立映射关系
将HDFS上的2.txt文件复制到/user/hive/warehouse/hello.db/t_user2目录下,在查看映射关系是否建立成功
复制命令:hadoop fs -cp /hivedata/2.txt /user/hive/warehouse/hello.db/t_user2
此时在/user/hive/warehouse/hello.db/t_user2目录下会多出一个2.txt文件
在客户端node02上查看映射关系是否成功
命令:select * from t_user2;
复杂数据类型
数据1:array
zhangsan beijing,shanghai,tianjin,hangzhou
lisi shanghai,chengdu,wuhan,haerbin
1、数据类型可以使用array<string>类型
2、以上数据类型的分隔符存在多种(tab符号以及,),所以需要添加其他的分隔符
字段之间分隔符使用t分割:row format delimited fields terminated by 't'
Array中元素采用,分割:collection items terminated by ','
创建表
create table t_user3(name string,work_locations array<string>) row format delimited fields terminated by 't' collection items terminated by ',';
创建映射文件
在HDFS上传3.txt文件,并在3.txt文件中填入以上数据
命令:hadoop fs -put 3.txt /hivedata
建立映射关系
将HDFS中的3.txt文件上传到Hive中的/user/hive/warehouse/hello.db/t_user3目录
命令:hadoop fs -cp /hivedata/3.txt /user/hive/warehouse/hello.db/t_user3
检查映射关系
数据2:map
1,zhangsan,唱歌:非常喜欢-跳舞:喜欢-游泳:一般般
2,lisi,打游戏:非常喜欢-篮球:不喜欢-游泳:一般般
3,wangwu,唱歌:不喜欢-跳舞:不喜欢-打游戏:非常喜欢
1、数据类型可以使用map<string,string>类型
2、以上数据类型的分隔符存在多种(,、:、-),所以需要添加其他的分隔符
字段之间分隔符使用,分割:row format delimited fields terminated by ','
map中元素采用-分割:collection items terminated by '-'
键值对之间采用:分割:map keys terminated by ':'
创建表
在node02上创建t_user4表,并添加分割符关系
create table t_user4(id int,name string,hobbies map<string,string>) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':';
创建映射文件
在HDFS上传4.txt文件,并在4.txt文件中填入以上数据
命令:hadoop fs -put 4.txt /hivedata
建立映射关系
将HDFS中的4.txt文件上传到Hive中的/user/hive/warehouse/hello.db/t_user4目录
命令:hadoop fs -cp /hivedata/4.txt /user/hive/warehouse/hello.db/t_user4
检查映射关系
默认分隔符
Hive建表的时候默认的分隔符为’001’,若在建表的时候没有指明分隔符,load文件的时候文件的分隔符需要是’001’。若文件分隔符不是’001’,程序不会报错,但是查询的结果全部为null
用vi编辑器Ctrl+v然后Ctrl+a即可输入’001’,显示的形式为^A
Serde是Serialize/Deserilize的简称,目的是用于序列化与反序列化。
Hive读取文件机制:首先调用InputFormat(默认TextInputFormat),返回一条一条记录(默认是一行对应一条记录)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer将一条记录切分为各个字段(默认’001’)
Hive写文件机制:将Row写入文件时,主要调用OutputFormat、Serde的Seriliazer,顺序与读取相反
创建表
命令: create table t_user5(id int,name string,password string);
创建该表的时候没有指定分隔符,那么在映射的时候会使用默认分隔符
创建映射文件
创建一个5.txt文件,在该文件中,数据与数据之间使用默认分隔符分割,如下图
上传文件到HDFS中:hadoop fs -put 5.txt /hivedata
建立映射关系
将HDFS中的5.txt文件复制到/user/hive/warehouse/hello.db/t_user5目录下
命令:hadoop fs -cp /hivedata/5.txt /user/hive/warehouse/hello.db/t_user5
在node02上查看是否建立映射关系:select * from t_user5;