2020.9.27(Hive Serde、HiveServer2、Hive函数)

回顾:上节课讲了hive的基本语句,DDL,DML
和MySQL差不多,但是也有一些自己独特的东西,比如在定义一张表的时候需要指定行格式。
这节课开始,hive的点就比较琐碎了。

Hive Serde

在这里插入图片描述
Hive SerDe - Serializer and Deserializer –SerDe 用于做序列化和反序列化。
什么意思?
hive在运行过程中,数据是存储在hdfs的,但是执行引擎是mapreduce,这两个之间有必然的关系么?
写的都是SQL语句,可以通过load的方式加载数据,也可以直接向hdfs里面上传数据文件。也可以读取进来,原因hive是读时检查,只要读取的数据文件,或指定的数据目录有数据文件,就可以把数据读进来。如果符合格式就正常显示,不符合格式就显示为null。这是正常的状态。
但是除此之外,如果遇到比较复杂的情况,数据里面包含int,String,Array,Map类型,这时候,Array里面能嵌套Map么?Map里面能嵌套Array么?
可以的。
在这里插入图片描述
data_type既包含了基本类型,又包含了复杂的类型,所以当表格嵌套非常复杂的情况,再使用ROW FORMAT row_format fields , collection items , map keys这样的方式来做分割的话可能就无法生效了。因此在这种形式后面个serde可以完成对应的行格式的解析的需求

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

具体需求:
在这里插入图片描述
想把这样的数据进行存储,但是时间字段前后的中括号没有实际意义,要求过滤掉中括号。请求有双引号,也要求过滤掉,最终在hive里面查看的时候没有中括号,没有双引号,该怎么实现。
最好的方式是使用正则表达式
在这里插入图片描述

"([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)"
([^ ]*)
^在中括号里表示取反,后面一个空的字符串,表示非空。
 \\[(.*)\\]
 表示要匹配中括号这个值了,里面是.*表示中括号里面所有字符留下,中括号不要
 \"(.*)\" 
 过滤双引号
 (-|[0-9]*)
 表示-或者09,任意数字,任意位数

这时候打开hive:
首先先把hive的元数据服务启动好:

hive --service metastore

打开hive的客户端,每次启动的时候比较慢,原因是什么?hive是需要连接到hdfs的,连接过程是比较浪费时间的。
在hive里执行语句:

CREATE TABLE logtbl ( 
host STRING,
identity STRING,
t_user STRING,
time STRING,
request STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)")
STORED AS TEXTFILE

该load数据文件了

load data local inpath "/root/data/log" into table logtbl;
select * from tbl;

中括号和双引号都没有了,因为匹配规则的时候匹配掉了。
这两种方式的应用场景分别是什么?
如果数据是规范化格式化的文件的话,不包含很多嵌套关系的话,就用之前的方式,如果数据结构比较复杂,包含了N多层的Array,Map的嵌套,推荐使用serde方式

HiveServer2 与函数操作

hive搭建成功后,在使用jdbc的方式访问hive的时候,并不能够访问成功,为什么?总是报连接拒绝的错误。
原因:jdbc在使用连接的时候,不能用之前的安装方式,需要换另外一种安装方式了。

HiveServer2是什么?

先打开两个页面

1.进入HIVE的HOME页面,找到HiveServer2: Overview, HiveServer2 Client and Beeline, Hive Metrics打开,找到HiveServer2也打开。

第一个印象,为什么叫hiveserver2,不叫hiveserver1?

HiveServer2 (HS2) is a server interface that enables remote clients to execute queries against Hive and retrieve the results (a more detailed intro here). The current implementation, based on Thrift RPC, is an improved version of HiveServer and supports multi-client concurrency and authentication. It is designed to provide better support for open API clients like JDBC and ODBC.
HiveServer2 (HS2)是一个服务接口,允许远程客户端去执行SQL语句,依托于hive,来检索对应的数据。(现在如果一个远程机,比如虚拟机是放在互联网环境里的,现在想连接需要开启一个hiveserver2的方式来检索数据)
当前版本的实现是基于Thrift RPC,(在连接元数据的时候也用到了Thrift RPC这个服务),对于hiveserver是一个提升的版本。
在安装目录下:
在这里插入图片描述
有hiveserver2,没有hiveserver已经完全被淘汰了,打开官网hiveServer页面
Thrift Hive Server

HiveServer is an optional service that allows a remote client to submit requests to Hive, using a variety of programming languages, and retrieve results. HiveServer is built on Apache ThriftTM (http://thrift.apache.org/), therefore it is sometimes called the Thrift server although this can lead to confusion because a newer service named HiveServer2 is also built on Thrift. Since the introduction of HiveServer2, HiveServer has also been called HiveServer1.
HiveServer 是一个可选的服务,允许一个远程的客户端去提交请求到hive(每一时刻只能有一个客户端进行访问),问题很大,并发受限。
在一个公司里面用hive的人只有一个开发程序员么?数据分析师。包括运营人员,推广人员,如果需要公司的历史数据,也是要做分析的。
同一时刻可能会有N多个用户,同时去访问对应的hive,这时候用hiveserver无法保证。
HiveServer2 (HS2) is a server interface that enables remote clients to execute queries against Hive and retrieve the results (a more detailed intro here). The current implementation, based on Thrift RPC, is an improved version of HiveServer and supports multi-client concurrency and authentication. It is designed to provide better support for open API clients like JDBC and ODBC.
hiveserver2支持多客户端并发访问和认证,这个目的是为了提供更好的支持给openAPI例如JDBC和ODBC的方式。所以hiveserver2在公司里用的是比较多的。

启动hiveServer2

两种方式:

$HIVE_HOME/bin/hiveserver2
hive --service hiveserver2

hiveserver2相当于是一个服务端,但是是针对用户来说,此时也需要连接到元数据服务。node03正开启着元数据服务能不能停掉?
可以的。
启动好之后注意了,这个窗口也是一个阻塞式窗口,同时提供了对外访问的端口号。比如MySQL想对外连接是开放了3306的端口对外部进行连接,这里也是一样的

ss -
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值