大数据生态系统基础: HIVE(二):HIVE 架构和HiveQL基本操作

        在“信息平台和数据科学家的崛起”中,Jeff Hammerbacher将信息平台描述为“他们的公司努力吸收、处理和产生信息的中心”,以及他们如何“促进从经验数据中学习的过程”。“Jeff团队在Face book上开发的信息平台的最大组成部分是Apache Hive,它是Hadoop上的数据仓库框架。

          Hive从需要管理和学习的大量数据中成长起来,这是Facebook每天从蓬勃发展的社交网络中产生的海量数据。在尝试了几个不同的系统之后,团队选择了Hadoop来进行存储和处理,因为它的成本是有效的,并且满足了可伸缩性需求。

            创建Hive是为了让具有强大SQL技能的分析师(但Java编程技能不高)能够对Facebook存储在HDFS上的海量数据进行查询。如今,Hive是一个成功的Apache项目,它被许多组织用作通用的、可扩展的数据处理平台。当然,SQL并不适合每一个大的数据问题,它不适合构建复杂的机器学习算法,但是它对很多分析来说都是很好的,而且它在业界非常有名。此外,SQL是商业智能工具中的通用语言(例如,ODBC是一个通用的桥梁),所以Hive可以很好地与这些产品集成。

    

一、定义

Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
二、适用范围
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,
Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
三、特点
Hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL 的HiveQL 语言实现数据查询,所有Hive 的数据都存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)中。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。
● 支持索引,加快数据查询。
● 不同的存储类型,例如,纯文本文件、HBase 中的文件。
● 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
● 可以直接使用存储在Hadoop 文件系统中的数据。
● 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
● 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
四、HIVE 体系结构

 分为 HIVE 用户接口、HIVE 服务、HIVE 存储和数据库
 如果您将Hive作为服务器运行(hive --service hiveserver2),有许多不同的机制可以从应用程序连接到它(在图中阐明了Hive客户机和Hive服务之间的关系):
1)Thrift客户端:Hive服务器作为一个thrift服务公开,因此可以使用任何支持thrift的编程语言与它进行交互。有一些第三方项目为Python和Ruby提供客户端;
2) JDBC客户端:Hive提供了一个Type 4 JDBC驱动程序(纯Java),org.apache.hadoop.hive.jdbc.HiveDriver中定义的类。当JDBC配置JDBC的URI形式:hive2:/ /host:port/ dbname, Java应用程序将连接到一个hive服务器运行在一个单独的进程在给定的主机和端口。(驱动程序调用由Hive thrift客户端实现的接口,使用Java thrift绑定。)客户端实现的接口,使用Java thrift绑定。)
3) ODBC 客户端:ODBC驱动程序允许支持ODBC协议(如业务智能软件)的应用程序连接到Hive。Apache Hive分发版不附带ODBC驱动程序,但是有几个供应商可以免费提供。(就像JDBC驱动程序一样,ODBC驱动程序使用thrift来与Hive服务器通信。)
元素存储MetaStore
MetaStore 是 Hive元数据的中心存储库。分为两部分:一种服务和数据的后备存储。默认情况下,元素存储服务在与Hive服务相同的JVM中运行,并包含由本地磁盘支持的嵌入式Derby数据库实例。这称为嵌入式的元素存储配置(参见图2,就是下图)。

使用嵌入式转移是一种简单的方法来开始使用Hive;然而,只有一个嵌入式Derby数据库可以在任何时候访问磁盘上的数据库文件,这意味着在访问相同的转移时,您只能打开一个Hive会话。尝试启动第二次会话时,会产生一个错误,当它试图打开与该转移的连接时。支持多个会话(因此多个用户)的解决方案是使用一个独立的数据库。这种配置被称为本地的转移,因为该转移服务仍然与Hive服务相同,但是连接到一个独立进程中运行的数据库,无论是在同一台机器上,还是在一台远程机器上。任何兼容jdbc的数据库都可以通过设置javax来使用。

五、Hive的基本概念
https://cwiki.apache.org/confluence/display/Hive/Tutorial

1)数据单元
    按照数据的粒度大小,hive数据可以被组织成:
    1)databases: 避免不同表产生命名冲突的一种命名空间
    2)tables:具有相同scema的同质数据的集合
    3)partitions:一个表可以有一个或多个决定数据如何存储的partition key
    4)buckets(或clusters):在同一个partition中的数据可以根据某个列的hash值分为多个bucket。partition和bucket并非必要,但是它们能大大加快数据的查询速度。

2)、数据类型
    (1)简单类型:

      
TINYINT - 1 byte integer
      SMALLINT - 2 byte integer
      INT - 4 byte integer
      BIGINT - 8 byte 
      BOOLEAN - TRUE/ FALSE
      FLOAT - 单精度
      DOUBLE - 双精度

  • DECIMAL一个固定的点值,用户定义的尺度和精度
  • VARCHAR—特定的字符序列,具有最大长度
  • CHAR—具有指定指定长度的字符集中的字符序列
  • TIMESTAMP一个特定的时间点,达到纳秒精度
  • DATE—一个日期
  • BINARY—字节序列

      STRING - 字符串集合
     (2)复杂类型:
        Structs : structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a。
         Maps(Key-Value对) :访问指定域可以通过['element name']进行,例如,一个Map M包含了一个group->gid的k-v对,gid的值可以通过M['group']来获取。
       Arrays: array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'。

3)、内建运算符和函数

      包括关系运算符(A=B, A!=B, A<B等等)、

      算术运算符(A+B, A*B, A&B, A|B等等)、

      逻辑运算符(A&&B, A|B等等)、

      复杂类型上的运算符(A[n], M[key], S.x)、

      各种内建函数:round,floor,substr

    

4)、语言能力
    hive查询语言提供基本的类sql操作,这些操作基于table和partition,包括:
    1. 使用where语句过滤制定行
    2. 使用select查找指定列
    3. join两张table
    4. group by
    5. 一个表的查询结果存入另一张表
    6. 将一个表的内容存入本地目录
    7. 将查询结果存储到hdfs上
    8. 管理table和partition(creat、drop、alert)
    9. 在查询中嵌入map-reduce程序


六、关系运算

1. 等值比较: =

         语法:A=B

         操作类型:所有基本类型

         描述: 如果表达式A与表达式B相等,则为TRUE;否则为FALSE

         举例:

         Hive>select 1 from lxw_dual where 1=1;


2. 不等值比较: <>

         语法: A <> B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <> 2;

注意:

由于在通常得SQL写法中不等于也可以这样写 != 。但在hive中,当一个string类型和int类型比较的时候会出现问题。


数字和数字类型用 可以用 != 比较:

[sql]  view plain  copy
  1. hive> select * from t_pvorder where 1 != 1 and start_date=20130306 limit 1;                     
  2. OK  
  3. Time taken: 0.079 seconds  


带引号的数字和数字类型 可以用!= 比较: 

[sql]  view plain  copy
  1. hive> select * from t_pvorder where "136258563267" != 0 and start_date=20130306 limit 1;      
  2. OK  
  3. 1323499396180741        13437046875509ec        0       102213  100002  01      -1      2013-03-06 20:59:07     1362574747440zW4        20130306  
  4. Time taken: 0.169 seconds  


带引号的数字和带引号数字类型 可以用 != 比较:

[sql]  view plain  copy
  1. hive> select * from t_pvorder where "136258563267" != "0" and start_date=20130306 limit 1;  
  2. OK  
  3. 1323499396180741        13437046875509ec        0       102213  100002  01      -1      2013-03-06 20:59:07     1362574747440zW4        20130306  
  4. Time taken: 0.129 seconds  

字符串和数字类型 不可以用 !=比较:

[sql]  view plain  copy
  1. hive> select * from t_pvorder where 0 != "1362585632671uFu" and start_date=20130306 limit 1;  
  2. Total MapReduce jobs = 1  
  3. Launching Job 1 out of 1  
  4. Number of reduce tasks is set to 0 since there's no reduce operator  
  5. //发起mapreduce   查不出结果  
  6. ....  


字符串和数字类型 不可以用 <> 比较:

[sql]  view plain  copy
  1. hive> select * from t_pvorder where 0 <> "1362585632671uFu" and start_date=20130306 limit 1;  
  2. Total MapReduce jobs = 1  
  3. Launching Job 1 out of 1  
  4. Number of reduce tasks is set to 0 since there's no reduce operator  
  5. //发起mapreduce   <span style="font-family: Arial, Helvetica, sans-serif;">查不出结果</span>  
  6. ....  


总之,用不等于比较的时候两者的字段类型尽量保持一致。


3. 小于比较: <

         语法: A < B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 < 2;

 

4. 小于等于比较: <=

语法: A <= B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <= 1;


5. 大于比较: >

语法: A > B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 2 > 1;

 

6. 大于等于比较: >=

语法: A >= B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 >= 1;

注意:String的比较要注意(常用的时间比较可以先to_date之后再比较)

hive> select* from lxw_dual;

OK

201111120900:00:00     2011111209


hive> selecta,b,a<b,a>b,a=b from lxw_dual;

201111120900:00:00     2011111209      false  true    false

 

7. 空值判断: IS NULL

语法: A IS NULL

操作类型: 所有类型

描述: 如果表达式A的值为NULL,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where null is null;

 

8. 非空判断: IS NOTNULL

语法: A IS NOT NULL

操作类型: 所有类型

描述: 如果表达式A的值为NULL,则为FALSE;否则为TRUE

举例:

hive> select1 from lxw_dual where 1 is not null;

 

9. LIKE比较: LIKE

语法: A LIKE B

操作类型: strings

描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B   的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。

举例:

hive> select1 from lxw_dual where 'football' like 'foot%';

hive> select1 from lxw_dual where 'football' like 'foot____';

注意:否定比较时候用NOT ALIKE B

hive> select1 from lxw_dual where NOT 'football' like 'fff%';

 

10. JAVA的LIKE操作: RLIKE

语法: A RLIKE B

操作类型: strings

描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合Java正则表达式B的正则语法,则为TRUE;否则为FALSE。

举例:

hive> select1 from lxw_dual where 'footbar’ rlike '^f.*r$’;

注意:判断一个字符串是否全为数字:

hive>select 1from lxw_dual where '123456' rlike '^\\d+$';

hive> select1 from lxw_dual where '123456aa' rlike '^\\d+$';

 

11. REGEXP操作: REGEXP

语法: A REGEXP B

操作类型: strings

描述: 功能与RLIKE相同

举例:

hive> select1 from lxw_dual where 'footbar' REGEXP '^f.*r$';


七、常用方法

1.字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:

Hive> select length(‘abcedfg’) from lxw_dual;


2. 字符串反转函数:reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:

hive> select reverse(abcedfg’) from lxw_dual;

gfdecba

3.字符串连接函数:concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

举例:

hive> select concat(‘abc’,’def’,’gh’) from lxw_dual;

abcdefgh

4.带分隔符字符串连接函数:concat_ws

语法: concat_ws(string SEP, string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

举例:

hive> select concat_ws(‘,’,’abc’,’def’,’gh’) from lxw_dual;

abc,def,gh

5.字符串截取函数:substr,substring

语法: substr(string A, int start),substring(string A, int start)

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:

hive> select substr(‘abcde’,3) from lxw_dual;

cde

hive> select substring(‘abcde’,3) from lxw_dual;

cde

hive> selectsubstr(‘abcde’,-1) from lxw_dual; (和Oracle相同)

e

6.字符串截取函数:substr,substring

语法: substr(string A, int start, int len),substring(string A, intstart, int len)

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:

hive> select substr(‘abcde’,3,2) from lxw_dual;

cd

hive> select substring(‘abcde’,3,2) from lxw_dual;

cd

hive>select substring(‘abcde’,-2,2) from lxw_dual;

de

7.字符串转大写函数:upper,ucase

语法: upper(string A) ucase(string A)

返回值: string

说明:返回字符串A的大写格式

举例:

hive> select upper(‘abSEd’) from lxw_dual;

ABSED

hive> select ucase(‘abSEd’) from lxw_dual;

ABSED

8.字符串转小写函数:lower,lcase

语法: lower(string A) lcase(string A)

返回值: string

说明:返回字符串A的小写格式

举例:

hive> select lower(‘abSEd’) from lxw_dual;

absed

hive> select lcase(‘abSEd’) from lxw_dual;

absed

9.去空格函数:trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:

hive> select trim(’ abc ‘) from lxw_dual;

abc

10.左边去空格函数:ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:

hive> select ltrim(’ abc ‘) from lxw_dual;

abc

11.右边去空格函数:rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:

hive> select rtrim(’ abc ‘) from lxw_dual;

abc

12.正则表达式替换函数:regexp_replace

语法: regexp_replace(string A, string B, string C)

返回值: string

说明:将字符串A中的符合Java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

举例:

hive> select regexp_replace(‘foobar’, ‘oo|ar’, ”) from lxw_dual;

fb

13.正则表达式解析函数:regexp_extract

语法: regexp_extract(string subject, string pattern, int index)

返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

举例:

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 1) fromlxw_dual;

the

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) fromlxw_dual;

bar

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 0) fromlxw_dual;

foothebar

注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。

select data_field,

 regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,

 regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,

 regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc

 from pt_nginx_loginlog_st

 where pt = '2012-03-26'limit 2;

14.URL解析函数:parse_url

语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

返回值: string

说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

举例:

hive> selectparse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1‘, ‘HOST’) fromlxw_dual;

facebook.com

hive> selectparse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1‘, ‘QUERY’,’k1’) from lxw_dual;

v1

15.json解析函数:get_json_object

语法: get_json_object(string json_string, string path)

返回值: string

说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。

举例:

hive> select get_json_object(‘{“store”:

{“fruit”:[{“weight”:8,”type”:”apple”},{“weight”:9,”type”:”pear”}],

“bicycle”:{“price”:19.95,”color”:”red”}

},

“email”:”amy@only_for_json_udf_test.NET”,

“owner”:”amy”

}

‘,’$.owner’) from lxw_dual;

amy

16.空格字符串函数:space

语法: space(int n)

返回值: string

说明:返回长度为n的字符串

举例:

hive> select space(10) from lxw_dual;

hive> select length(space(10)) from lxw_dual;

10

17.重复字符串函数:repeat

语法: repeat(string str, int n)

返回值: string

说明:返回重复n次后的str字符串

举例:

hive> select repeat(‘abc’,5) from lxw_dual;

abcabcabcabcabc

18.首字符ascii函数:ascii

语法: ascii(string str)

返回值: int

说明:返回字符串str第一个字符的ascii码

举例:

hive> select ascii(‘abcde’) from lxw_dual;

97

19.左补足函数:lpad

语法: lpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行左补足到len位

举例:

hive> select lpad(‘abc’,10,’td’) from lxw_dual;

tdtdtdtabc

注意:与GP,ORACLE不同,pad 不能默认

20.右补足函数:rpad

语法: rpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行右补足到len位

举例:

hive> select rpad(‘abc’,10,’td’) from lxw_dual;

abctdtdtdt

21.分割字符串函数: split

语法: split(string str, stringpat)

返回值: array

说明: 按照pat字符串分割str,会返回分割后的字符串数组

举例:

hive> select split(‘abtcdtef’,’t’) from lxw_dual;

[“ab”,”cd”,”ef”]

22.集合查找函数:find_in_set

语法: find_in_set(string str, string strList)

返回值: int

说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0

举例:

hive> select find_in_set(‘ab’,’ef,ab,de’) from lxw_dual;

2

hive> select find_in_set(‘at’,’ef,ab,de’) from lxw_dual;

0


发布了52 篇原创文章 · 获赞 4 · 访问量 5万+

1.字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:

Hive> select length(‘abcedfg’) from lxw_dual;


2. 字符串反转函数:reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:

hive> select reverse(abcedfg’) from lxw_dual;

gfdecba

3.字符串连接函数:concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

举例:

hive> select concat(‘abc’,’def’,’gh’) from lxw_dual;

abcdefgh

4.带分隔符字符串连接函数:concat_ws

语法: concat_ws(string SEP, string A, string B…)

返回值: string

说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

举例:

hive> select concat_ws(‘,’,’abc’,’def’,’gh’) from lxw_dual;

abc,def,gh

5.字符串截取函数:substr,substring

语法: substr(string A, int start),substring(string A, int start)

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:

hive> select substr(‘abcde’,3) from lxw_dual;

cde

hive> select substring(‘abcde’,3) from lxw_dual;

cde

hive> selectsubstr(‘abcde’,-1) from lxw_dual; (和Oracle相同)

e

6.字符串截取函数:substr,substring

语法: substr(string A, int start, int len),substring(string A, intstart, int len)

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:

hive> select substr(‘abcde’,3,2) from lxw_dual;

cd

hive> select substring(‘abcde’,3,2) from lxw_dual;

cd

hive>select substring(‘abcde’,-2,2) from lxw_dual;

de

7.字符串转大写函数:upper,ucase

语法: upper(string A) ucase(string A)

返回值: string

说明:返回字符串A的大写格式

举例:

hive> select upper(‘abSEd’) from lxw_dual;

ABSED

hive> select ucase(‘abSEd’) from lxw_dual;

ABSED

8.字符串转小写函数:lower,lcase

语法: lower(string A) lcase(string A)

返回值: string

说明:返回字符串A的小写格式

举例:

hive> select lower(‘abSEd’) from lxw_dual;

absed

hive> select lcase(‘abSEd’) from lxw_dual;

absed

9.去空格函数:trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:

hive> select trim(’ abc ‘) from lxw_dual;

abc

10.左边去空格函数:ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:

hive> select ltrim(’ abc ‘) from lxw_dual;

abc

11.右边去空格函数:rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:

hive> select rtrim(’ abc ‘) from lxw_dual;

abc

12.正则表达式替换函数:regexp_replace

语法: regexp_replace(string A, string B, string C)

返回值: string

说明:将字符串A中的符合Java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

举例:

hive> select regexp_replace(‘foobar’, ‘oo|ar’, ”) from lxw_dual;

fb

13.正则表达式解析函数:regexp_extract

语法: regexp_extract(string subject, string pattern, int index)

返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

举例:

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 1) fromlxw_dual;

the

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) fromlxw_dual;

bar

hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 0) fromlxw_dual;

foothebar

注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。

select data_field,

 regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,

 regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,

 regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc

 from pt_nginx_loginlog_st

 where pt = '2012-03-26'limit 2;

14.URL解析函数:parse_url

语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

返回值: string

说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

举例:

hive> selectparse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1‘, ‘HOST’) fromlxw_dual;

facebook.com

hive> selectparse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1‘, ‘QUERY’,’k1’) from lxw_dual;

v1

15.json解析函数:get_json_object

语法: get_json_object(string json_string, string path)

返回值: string

说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。

举例:

hive> select get_json_object(‘{“store”:

{“fruit”:[{“weight”:8,”type”:”apple”},{“weight”:9,”type”:”pear”}],

“bicycle”:{“price”:19.95,”color”:”red”}

},

“email”:”amy@only_for_json_udf_test.NET”,

“owner”:”amy”

}

‘,’$.owner’) from lxw_dual;

amy

16.空格字符串函数:space

语法: space(int n)

返回值: string

说明:返回长度为n的字符串

举例:

hive> select space(10) from lxw_dual;

hive> select length(space(10)) from lxw_dual;

10

17.重复字符串函数:repeat

语法: repeat(string str, int n)

返回值: string

说明:返回重复n次后的str字符串

举例:

hive> select repeat(‘abc’,5) from lxw_dual;

abcabcabcabcabc

18.首字符ascii函数:ascii

语法: ascii(string str)

返回值: int

说明:返回字符串str第一个字符的ascii码

举例:

hive> select ascii(‘abcde’) from lxw_dual;

97

19.左补足函数:lpad

语法: lpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行左补足到len位

举例:

hive> select lpad(‘abc’,10,’td’) from lxw_dual;

tdtdtdtabc

注意:与GP,ORACLE不同,pad 不能默认

20.右补足函数:rpad

语法: rpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行右补足到len位

举例:

hive> select rpad(‘abc’,10,’td’) from lxw_dual;

abctdtdtdt

21.分割字符串函数: split

语法: split(string str, stringpat)

返回值: array

说明: 按照pat字符串分割str,会返回分割后的字符串数组

举例:

hive> select split(‘abtcdtef’,’t’) from lxw_dual;

[“ab”,”cd”,”ef”]

22.集合查找函数:find_in_set

语法: find_in_set(string str, string strList)

返回值: int

说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0

举例:

hive> select find_in_set(‘ab’,’ef,ab,de’) from lxw_dual;

2

hive> select find_in_set(‘at’,’ef,ab,de’) from lxw_dual;

0

猜你喜欢

转载自blog.csdn.net/caridle/article/details/77449931