Hive教程

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。

它包含两个模块,一个是MapReduce,另外一个是Hadoop分布式文件系统(HDFS)。

Hadoop生态系统包含了用于协助Hadoop的不同的子项目(工具)模块,如Sqoop, Pig Hive

  • Sqoop: 它是用来在HDFSRDBMS之间来回导入和导出数据。
  • Pig: 它是用于开发MapReduce操作的脚本程序语言的平台。
  • Hive: 它是用来开发SQL类型脚本用于做MapReduce操作的平台。

Hive的特点

可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务

延展性

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

容错

良好的容错性,节点出现问题SQL仍可完成执行

Hive教程http://sishuok.com/forum/blogPost/list/6220.html

第一部分:关系运算

Hive支持的关系运算符

常见的关系运算符

等值比较: =

不等值比较: <>

小于比较: <

小于等于比较: <=

大于比较: >

大于等于比较: >=

空值判断: IS NULL

非空判断: IS NOT NULL

•LIKE比较: LIKE

•JAVALIKE操作: RLIKE

•REGEXP操作: REGEXP

等值比较: =

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

•JAVALIKE操作: RLIKE

语法: A RLIKE B

操作类型: strings

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

举例:

hive> select 1 from dual where 'footbar’ rlike '^f.*r$’;

1

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

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

1

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

1

•REGEXP操作: REGEXP

语法: A REGEXP B

操作类型: strings

描述: 功能与RLIKE相同

举例:

hive> select 1 from dual where ‘key' REGEXP '^f.*r$';

1

 

第二部分:逻辑运算与数学运算

Hive数学运算

加法操作: +

减法操作: -

乘法操作: *

除法操作: /

取余操作: %

位与操作: &

位或操作: |

位异或操作: ^

位取反操作: ~

加法操作: +

注意: hive 中最高精度的数据类型是 double, 只精确到小数点后 16 位,在做除法运算的时候要 特别注意

Hive逻辑运算

逻辑与操作: AND

逻辑或操作: OR

逻辑非操作: NOT

 

第三部分:数值运算

取整函数: round

指定精度取整函数: round

向下取整函数: floor

向上取整函数: ceil

向上取整函数: ceiling

取随机数函数: rand

自然指数函数: exp

10为底对数函数: log10

2为底对数函数: log2

• 对数函数: log

幂运算函数: pow

幂运算函数: power

开平方函数: sqrt

二进制函数: bin

十六进制函数: hex

反转十六进制函数: unhex

进制转换函数: conv

绝对值函数: abs

正取余函数: pmod

正弦函数: sin

反正弦函数: asin

余弦函数: cos

反余弦函数: acos

•positive函数: positive

•negative函数: negative

 

第四部分:日期函数

•UNIX时间戳转日期函数: from_unixtime

• 获取当前UNIX时间戳函数: unix_timestamp

日期转UNIX时间戳函数: unix_timestamp

• 指定格式日期转UNIX时间戳函数: unix_timestamp

日期时间转日期函数: to_date

日期转年函数: year

• 日期转月函数: month

• 日期转天函数: day

• 日期转小时函数: hour

• 日期转分钟函数: minute

• 日期转秒函数: second

• 日期转周函数: weekofyear

• 日期比较函数: datediff

• 日期增加函数: date_add

• 日期减少函数: date_sub

 

第六部分:字符串函数(较生疏)

字符串长度函数:length

字符串反转函数:reverse

字符串连接函数:concat

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

• 字符串截取函数:substr,substring

• 字符串截取函数:substr,substring

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

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

• 去空格函数:trim

• 左边去空格函数:ltrim

• 右边去空格函数:rtrim

正则表达式替换函数:regexp_replace

正则表达式解析函数:regexp_extract

•URL解析函数:parse_url

•json解析函数:get_json_object

空格字符串函数:space

重复字符串函数:repeat

首字符ascii函数:ascii

左补足函数:lpad

右补足函数:rpad

分割字符串函数: split

集合查找函数: find_in_set

• URL 解析函数: parse_url

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

返回值: string

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

举例:

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual;

facebook.com

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1') from dual;

v1

• 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 dual;

amy

 

第七部分:集合统计函数

个数统计函数: count

总和统计函数: sum

平均值统计函数: avg

• 最小值统计函数: min

最大值统计函数: max

• 个数统计函数 : count

 

第八部分:符合类型构建操作

•Map类型构建: map

•Struct类型构建: struct

•array类型构建: array

• Map 类型构建 : map

语法: map (key1, value1, key2, value2, …)

说明:根据输入的keyvalue对构建map类型

举例:

hive> Create table alex_test as select map('100','tom','200','mary') as t from dual;

hive> describe alex_test;

t       map<string,string>

hive> select t from alex_test;

{"100":"tom","200":"mary"}

• Struct 类型构建 : struct

语法: struct(val1, val2, val3, …)

说明:根据输入的参数构建结构体struct类型

举例:

hive> create table alex_test as select struct('tom','mary','tim') as t from dual;

hive> describe alex_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t from alex_test;

{"col1":"tom","col2":"mary","col3":"tim"}

• array 类型构建 : array

语法: array(val1, val2, …)

说明:根据输入的参数构建数组array类型

举例:

hive> create table alex_test as select array("tom","mary","tim") as t from dual;

hive> describe alex_test;

t       array<string>

hive> select t from alex_test;

["tom","mary","tim"]

 

 

第九部分:复杂类型访问操作

•array类型访问: A[n]

•map类型访问: M[key]

•struct类型访问: S.x

• array 类型访问 : A[n]

语法: A[n]

操作类型: Aarray类型,nint类型

说明:返回数组A中的第n个变量值。数组的起始下标为0。比如,A是个值为['foo', 'bar']的数组类型,那么A[0]将返回'foo',A[1]将返回'bar'

举例:

hive> create table alex_test as select array("tom","mary","tim") as t from dual;

hive> select t[0],t[1],t[2] from alex_test;

tom     mary    tim

• map 类型访问 : M[key]

语法: M[key]

操作类型: Mmap类型,keymap中的key

说明:返回map类型M中,key值为指定值的value值。比如,M是值为{'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}map类型,那么M['all']将会返回'foobar'

举例:

hive> Create table alex_test as select map('100','tom','200','mary') as t from dual;

hive> select t['200'],t['100'] from alex_test;

mary    tom

• struct 类型访问 : S.x

语法: S.x

操作类型: Sstruct类型

说明:返回结构体S中的x字段。比如,对于结构体struct foobar {int foo, int bar}foobar.foo返回结构体中的foo字段

举例:

hive> create table alex_test as select struct('tom','mary','tim') as t from dual;

hive> describe alex_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t.col1,t.col3 from alex_test;

tom     tim

第十部分:复杂类型长度统计函数

•Map类型长度函数: size(Map<K.V>)

•array类型长度函数: size(Array<T>)

类型转换函数

 

• Map 类型长度函数 : size(Map<K.V>)

语法: size(Map<K.V>)

返回值: int

说明: 返回map类型的长度

举例:

hive> select size(map('100','tom','101','mary')) from dual;

2

 

• array 类型长度函数 : size(Array<T>)

语法: size(Array<T>)

返回值: int

说明: 返回array类型的长度

举例:

hive> select size(array('100','101','102','103')) from dual;

4

 

• 类型转换函数

类型转换函数: cast

语法: cast(expr as <type>)

返回值: Expected "=" to follow "type"

说明: 返回array类型的长度

举例:

hive> select cast(1 as bigint) from dual;

1

 

自定义函数

虽然Hive提供了很多函数,但是有些还是难以满足我们的需求。因此Hive提供了自定义函数开发

自定义函数包括三种UDFUADFUDTF

•UDF(User-Defined-Function)

•UDAFUser- Defined Aggregation Funcation

•UDTF(User-Defined Table-Generating Functions)  用来解决 输入一行输出多行(On-to-many maping) 的需求。

 

第一部分:DDL

DDL

建表

删除表

修改表结构

创建/删除视图

创建数据库

显示命令

建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
  [(col_name data_type [COMMENT col_comment], ...)] 
  [COMMENT table_comment] 
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
  [CLUSTERED BY (col_name, col_name, ...) 
  [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
  [ROW FORMAT row_format] 
  [STORED AS file_format] 
  [LOCATION hdfs_path]

•CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常

•EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION

•LIKE 允许用户复制现有的表结构,但是不复制数据

•COMMENT可以为表与字段增加描述

 

•ROW FORMAT

    DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

         用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDeHive 通过 SerDe 确定表的具体的列的数据。

•STORED AS

            SEQUENCEFILE

            | TEXTFILE

            | RCFILE    

            | INPUTFORMAT input_format_classname OUTPUTFORMAT             output_format_classname

       如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE

INSERT INTO 

•INSERT INTO  TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

不支持EXIST ,NOT EXIST

ORDER BYSORT BY的不同

•ORDER BY 全局排序,只有一个Reduce任务

•SORT BY 只在本机做排序

join 查询时,需要注意几个关键点

只支持等值join

•SELECT a.* FROM a JOIN b ON (a.id = b.id)

•SELECT a.* FROM a JOIN b 
    ON (a.id = b.id AND a.department = b.department)

可以 join 多于 2 个表,例如

  SELECT a.val, b.val, c.val FROM a JOIN b 
    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

 

Hive易错语法http://blog.csdn.net/javajxz008/article/details/51381163

1.hive在连接中不支持不等值连接,不支持orwhere条件后不支持子查询。分别举例如下及实现解决办法。
  1.1.不支持不等值连接
       错误:select * from a inner join b on a.id<>b.id
      
替代方法:select * from a inner join b on a.id=b.id and a.id is null;
  1.2.
不支持or
      
错误:select * from a inner join b on a.id=b.id or a.name=b.name
      
替代方法:select * from a inner join b on a.id=b.id
                union all
                select * from a inner join b on a.name=b.name
  1.3.where
后不支持子查询
       错误:select * from a where a.id in (select id from b)
      
替代方法:select * from a inner join b on a.id=b.id in的另外一种高效实现left-semi join
       select a.* from a left-semi join b on a.id=b.id a
idbid中,但是只能select a表中的字段,不能把b表中的字段查出来。另外right join full join
      
不支持这种写法。
  1.4.两个sql union all的字段名必须一样或者列别名要一样。
2.hive不支持where条件后的列别名
  错误:select sum(a.amt) as total from a where a.total>20
 
替代方法:select total from (select sum(a.amt) as total from a) a where total>20 
 
这种方式下例外:select id,count(*) as amt from a where dt='20160101' group by id having amt>1
3.
谓词前推
  数据量提前过滤,加分区过滤。
4.计算日期间相隔天数,函数datediff要求日期格式为10位,如2012-10-12
5.
为了提高hive sql的执行效率可以在执行hql前设置性能参数,只针对当前会话有效。如
  set hive.auto.convert.join=false;
  set hive.ignore.mapjoin.hint=false;
  set hive.exec.parallel=true;
  set hive.exec.parallel.thread.number=16;
  set hive.groupby.skewindata=true;
  set mapred.reduce.tasks=30;
6.
按模式匹配字符串取其中的部分。
  regexp_extract(a.ed_logo,'(.*)(.0)',1) --字段ed_logo按正则表达式'(.*)(.0)'匹配, 匹配后取第一个部分。如187.0,得187
7.hive
排序
  row_number() over (distribute by ED_APPLICATION_ID sort by ED_CARD_SEQ desc),按字段ED_APPLICATION_ID分组,按ED_CARD_SEQ降序排序。distribute也可用partition,sort by也可以用
  order by
  三种排序及例子:
  row_number() ---
  rank()          |+ distribute by field1 sort by field2 [desc|asc]      
  dense_rank()----
 
表结果及值如下:
  hive> desc mid;
  OK
  id                   string                                   
  value                string  
 hive> select * from mid;
 OK
 1001 12
 1001 13
 1001 14
 1001 12
 1002 13
 1003 14
 1004 15
 
 select *,row_number() over(distribute by id sort by value) as rank from mid; 
 1001 12 1
 1001 12 2
 1001 13 3
 1001 14 4
 1002 13 1
 1003 14 1
 1004 15 1
 row_number()--
重复项依然会递增编号
 
 select *,dense_rank() over(distribute by id sort by value) as rank from mid; 
 1001 12 1
 1001 12 1
 1001 13 2
 1001 14 3
 1002 13 1
 1003 14 1
 1004 15 1
 dense_rank()--
重复项编号相同
 
 select *,rank() over(partition by id sort by value) as rank from mid; 
 1001 12 1
 1001 12 1
 1001 13 3
 1001 14 4
 1002 13 1
 1003 14 1
 1004 15 1
 rank()----
重复项编号相同,但是后续会跳过一个编号。

 

8.collect_set(field)[index]--去重
  collect_list(field)[index]--不去重

 

  select id,collect_set(value)[0] from mid group by id;
  1001 14
  1002 13
  1003 14
  1004 15
 
目测去重后从大到小放入集合
  
  select id,collect_list(value)[0] from mid group by id;
  1001 12
  1002 13
  1003 14
  1004 15
  
9.
sql中使用udf
 
定义类继承udf类,重写evaluate方法,该方法支持重载,打成jar包,使用如下:
  add jar /home/myudf.jar;
  create temporary function as myfunction as 'com.comp.udf.UDFClass';
  select myfunction(args) from table_name 

 

参考网址:

http://sishuok.com/forum/blogPost/list/6220.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值