hive 修改cluster by算法_疯狂Hive之DDL操作一(二)

本文详细介绍了如何在Hive中创建表并与HDFS上的文件建立映射关系,包括使用DDL操作Hive表,处理不同分隔符的数据,以及处理复杂数据类型如array和map。通过示例展示了创建映射表、指定分隔符、建立映射文件的过程,并强调了默认分隔符和SerDe在数据序列化和反序列化中的作用。
摘要由CSDN通过智能技术生成

6ca8779c63b3648d17660ca96b4f4a1e.png

DDL操作

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

在HDFS上创建映射文件

在node01上创建文件夹:mkdir hivedata

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

cd hivedata

vi 1.txt

在1.txt中编写如下数据

0bc605fb79ca5c09f0fe604c16c3b314.png

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

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

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

85d2e72e23de1c8bf57cac86414c0ce6.png

在Hive中创建映射表

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

使用hello数据库:use hello;

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

70d10ea67c6a568a21bad1e03a6579c1.png

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

72d6e78c479d68d85ee2779a27123257.png

建立表与文件的映射

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

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

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

4c90fc1c53b18fef48b24c1e543ccbc4.png

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

cac9dc491d075777b173dd0d66a44bc6.png

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

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

72ebfdc557070ab42244afc8721cc2ff.png

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

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

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

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

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

887b193452226012b385faf6e6056dd7.png

在Hive中能查询到结果

52c6be2b65fbbce58936ca49a4fb4cd8.png

Hive数据类型&分隔符

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

简单数据类型

建立Hive连接

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

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

505409283fcacdeec1960a6596cae703.png

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

3eb038e82d493720556d5081118d86cc.png

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

a135ef0f6b878ba5e8261254f9ce7ba2.png

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

创建表

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

创表语句

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

d1a78df3b2b7df9bdf13511f2e5e6eda.png

建立映射关系

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

bd6220346cf25573c102dd88c43d909d.png

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

命令:select * from t_user2;

1e12d19670bc596712e3882f90eb75d2.png

复杂数据类型

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

dcd59b534047d82dec4c123696a819d2.png

创建映射文件

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

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

0d17cc8e2c2ead05baa80c279b952428.png

建立映射关系

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

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

检查映射关系

379ead3f7d5d043b01c3132acd52929a.png

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

4ab50a88904ad9783263c88d6c04d36e.png

建立映射关系

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

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

检查映射关系

d7fcf0ca479f9929032cefaf0ba34d4a.png

默认分隔符

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

0a8c91bd06473385e5f18d297361a97f.png

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

cfd1772641225216885ee73458493249.png

建立映射关系

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

a03e7ec4c814ef1352796beadbd24410.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值