疯狂Hive之DDL操作一(二)

DDL操作

Hive中的表如何与HDFS上文件中的数据产生映射关系?

在HDFS上创建映射文件

在node01上创建文件夹:mkdir hivedata

在hivedata中新建一个文件1.txt文件:

cd hivedata

vi 1.txt

在1.txt中编写如下数据

 

疯狂Hive之DDL操作一(二)

 

 

将1.txt文件上传到HDFS上的hivedata目录中

HDFS新建hivedata目录:hadoop fs -mkdir /hivedata

上传1.txt文件到hivedata目录:hadoop fs -put /root/hivedata/1.txt /hivedata

 

疯狂Hive之DDL操作一(二)

 

在Hive中创建映射表

在Hive的hello数据库中创建一张表

使用hello数据库:use hello;

创建t_user1表:create table t_user1(id int,name string,age int);

 

疯狂Hive之DDL操作一(二)

 

此时在HDFS上的/user/hive/warehouse路径下会生成一个hello.db的数据库,t_user1表在该文件夹下

 

疯狂Hive之DDL操作一(二)

 

 

建立表与文件的映射

操作:将HDFS上的1.txt文件赋值到t_user1表中去

命令:hadoop fs -cp /hivedata/1.txt /user/hive/warehouse/hello.db/t_user1

结果:在HDFS的t_user1文件夹下多出一个1.txt文件

 

疯狂Hive之DDL操作一(二)

 

在node02上查询表中数据,发现Hive感知到文件中的数据,但是数据没有解析出 来

 

疯狂Hive之DDL操作一(二)

 

原因:解析数据的时候,没有规定数据之间的分割符样式

解决办法: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;

 

疯狂Hive之DDL操作一(二)

 

此时发现,HDFS上文件数据与Hive表之间映射成功。

作用:映射关系一旦建立,就可以通过Hive来操作HDFS中结构化的数据,通过sql语句来操作MapReduce程序

如:查询1.txt文件中有多少条数据

执行sql:select count(*) from t_user1;

此时打开YRAN的web-ui界面,可以查看MR程序的运行

 

疯狂Hive之DDL操作一(二)

 

在Hive中能查询到结果

 

疯狂Hive之DDL操作一(二)

 

 

Hive数据类型&分隔符

Hive中数据类型除了可以使用传统数据库数据类型以外,还可以使用Hive自带的数据类型。并且在Hive中创建表格时需要指定分割符。

 

简单数据类型

建立Hive连接

利用客户端机器node02连接node01上的Hive服务

在HDFS上的hivedate目录下提交一个文件2.txt,在文件中编写如下内容

 

疯狂Hive之DDL操作一(二)

 

 

提交命令:hadoop fs -put 2.txt /hivedata

 

疯狂Hive之DDL操作一(二)

 

此时在HDFS上就存在一个文件2.txt

 

疯狂Hive之DDL操作一(二)

 

 

在Hive中创建表格,并让表格与2.txt文件之间产生映射关系

 

创建表

在创建表时,数据类型与传统数据类型大体一致,但是由于2.txt文件中数据之间以逗号分隔,所以在后期如果想要映射成功,在创建表格时需要指定分割符

创表语句

create table t_user2(id int,name string,score int) row format delimited fields terminated by ',';

 

疯狂Hive之DDL操作一(二)

 

建立映射关系

将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文件

 

疯狂Hive之DDL操作一(二)

 

在客户端node02上查看映射关系是否成功

命令:select * from t_user2;

 

疯狂Hive之DDL操作一(二)

 

 

复杂数据类型

数据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 ',';

 

疯狂Hive之DDL操作一(二)

 

 

创建映射文件

在HDFS上传3.txt文件,并在3.txt文件中填入以上数据

命令:hadoop fs -put 3.txt /hivedata

 

疯狂Hive之DDL操作一(二)

 

建立映射关系

将HDFS中的3.txt文件上传到Hive中的/user/hive/warehouse/hello.db/t_user3目录

命令:hadoop fs -cp /hivedata/3.txt /user/hive/warehouse/hello.db/t_user3

检查映射关系

 

疯狂Hive之DDL操作一(二)

 

 

 

数据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

 

疯狂Hive之DDL操作一(二)

 

 

建立映射关系

将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之DDL操作一(二)

 

 

 

默认分隔符

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文件,在该文件中,数据与数据之间使用默认分隔符分割,如下图

 

疯狂Hive之DDL操作一(二)

 

上传文件到HDFS中:hadoop fs -put 5.txt /hivedata

 

疯狂Hive之DDL操作一(二)

 

 

建立映射关系

将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;

 

疯狂Hive之DDL操作一(二)