Hadoop学习(6)——Hive SQL(3)高级用法

一、Hive分区

创建分区表:

单分区
create table psn5
(
id int,
name string,
likes array<string>,
address map<string,string>
)
partitioned by(age int)
row format delimited 
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';

双分区:
create table psn6
(
id int,
name string,
likes array<string>,
address map<string,string>
)
partitioned by(age int,sex string)
row format delimited 
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';


create external table psn7
(
id int,
name string,
likes array<string>,
address map<string,string>
)
partitioned by(age int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/usr/';

 (1)Hive 分区partition:必须在表定义时指定对应的partition字段

a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分

b、 双分区建表语句:
create table day_hour_table (id int, content string) partitioned by (dt string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以dt为文件夹,再以hour子文件夹区分

(2)Hive添加分区表语法(表已创建,在此基础上添加分区)

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec  [LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;

partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
例:
ALTER TABLE day_table ADD PARTITION (dt='2008-08-08', hour='08')

(3)Hive删除分区语法

ALTER TABLE table_name DROP partition_spec, partition_spec,...
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)

用户可以用 ALTER TABLE DROP PARTITION 来删除分区。
内部表中、对应分区的元数据和数据将被一并删除。

例:
ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');

(4)Hive向指定分区添加数据语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] 

例:
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08'); 
LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');

当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录

(5)Hive查询执行分区语法 

SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08'; 
分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。

Hive查询表的分区信息语法:
SHOW PARTITIONS day_hour_table; 

预先导入分区数据,但是无法识别怎么办
Msck repair table tablename
直接添加分区

二、Hive SerDe

 (1)作用

SerDe 用于做序列化和反序列化,构建在数据存储和执行引擎之间,对两者实现解耦,Hive通过ROW   FORMAT   DELIMITED以及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] 
: SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

(2)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;

三、Hive Beeline 

(1)作用

Beeline 要与HiveServer2配合使用

服务端启动hiveserver2

客户的通过beeline两种方式连接到hive:

1、beeline -u jdbc:hive2://localhost:10000/default -n root
2、beeline
beeline> !connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl root 123

默认 用户名、密码不验证

四、Hive JDBC

 (1)Hive JDBC运行方式

服务端启动hiveserver2后,在java代码中通过调用hivejdbc访问默认端口10000进行连接、访问

(2)代码

五、常用函数

(1)关系运算符

(1)A LIKE B	字符串	如 果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过sql进行匹配,如果相符返回TRUE,不符返回FALSE。B字符串中 的”_”代表任一字符,”%”则代表多个任意字符。例如: (‘foobar’ like ‘foo’)返回FALSE,( ‘foobar’ like ‘foo_ _ _’或者 ‘foobar’ like ‘foo%’)则返回TURE
(2)A RLIKE B	字符串	如 果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过java进行匹配,如果相符返回TRUE,不符返回FALSE。例如:( ‘foobar’ rlike ‘foo’)返回FALSE,(’foobar’ rlike ‘^f.*r$’ )返回TRUE。
(3)A REGEXP B	字符串	与RLIKE相同。

(2) 算术运算符

(1)A & B	所有数字类型	运算符查看两个参数的二进制表示法的值,并执行按位”与”操作。两个表达式的一位均为1时,则结果的该位为 1。否则,结果的该位为 0。
A|B	所有数字类型 	运算符查看两个参数的二进制表示法的值,并执行按位”或”操作。只要任一表达式的一位为 1,则结果的该位为 1。否则,结果的该位为 0。 
(2)A ^ B	所有数字类型	运算符查看两个参数的二进制表示法的值,并执行按位”异或”操作。当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。
(3)~A	所有数字类型	对一个表达式执行按位”非”(取反)。

(3)复杂类型函数

(1)map	(key1, value1, key2, value2, …)	通过指定的键/值对,创建一个map。
(2)struct	(val1, val2, val3, …)	通过指定的字段值,创建一个结构。结构字段名称将COL1,COL2,…
(3)array	(val1, val2, …)	通过指定的元素,创建一个数组。

 对复杂类型函数操作:

函数

类型

说明

A[n]

A是一个数组,n为int型

返回数组A的第n个元素,第一个元素的索引为0。如果A数组为['foo','bar'],则A[0]返回’foo’和A[1]返回”bar”。

M[key]

M是Map<K, V>,关键K型

返回关键值对应的值,例如mapM为 \{‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘all’ -> ‘foobar’\},则M['all'] 返回’foobar’。

S.x

S为struct

返回结构x字符串在结构S中的存储位置。如 foobar \{int foo, int bar\} foobar.foo的领域中存储的整数。

(4)收集函数

返回类型

函数

说明

int

size(Map<K.V>)

返回的map类型的元素的数量

int

size(Array<T>)

返回数组类型的元素数量

(5)类型转换函数

返回类型

函数

说明

指定 “type”

cast(expr as <type>)

类型转换。例如将字符”1″转换为整数:cast(’1′ as bigint),如果转换失败返回NULL。

(6)数学函数

返回类型

函数

说明

BIGINT

round(double a)

四舍五入

DOUBLE

round(double a, int d)

小数部分d位之后数字四舍五入,例如round(21.263,2),返回21.26

BIGINT

floor(double a)

对给定数据进行向下舍入最接近的整数。例如floor(21.2),返回21。

BIGINT

ceil(double a), ceiling(double a)

将参数向上舍入为最接近的整数。例如ceil(21.2),返回23.

double

rand(), rand(int seed)

返回大于或等于0且小于1的平均分布随机数(依重新计算而变)

double

exp(double a)

返回e的n次方

double

ln(double a)

返回给定数值的自然对数

double

log10(double a)

返回给定数值的以10为底自然对数

double

log2(double a)

返回给定数值的以2为底自然对数

double

log(double base, double a)

返回给定底数及指数返回自然对数

double

pow(double a, double p) power(double a, double p)

返回某数的乘幂

double

sqrt(double a)

返回数值的平方根

string

bin(BIGINT a)

返回二进制格式

string

hex(BIGINT a) hex(string a)

将整数或字符转换为十六进制格式

string

unhex(string a)

十六进制字符转换由数字表示的字符。

string

conv(BIGINT num, int from_base, int to_base)

将 指定数值,由原来的度量体系转换为指定的试题体系。例如CONV(‘a’,16,2),返回。参考:’1010′ http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv

double

abs(double a)

取绝对值

int double

pmod(int a, int b) pmod(double a, double b)

返回a除b的余数的绝对值

double

sin(double a)

返回给定角度的正弦值

double

asin(double a)

返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL。

double

cos(double a)

返回余弦

double

acos(double a)

返回X的反余弦,即余弦是X,,如果-1<= A <= 1,否则返回null.

int double

positive(int a) positive(double a)

返回A的值,例如positive(2),返回2。

int double

negative(int a) negative(double a)

返回A的相反数,例如negative(2),返回-2。

 (7)日期函数

返回类型

函数

说明

string

from_unixtime(bigint unixtime[, string format])

UNIX_TIMESTAMP参数表示返回一个值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。

bigint

unix_timestamp()

如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 – 0100:00:00′到现在的UTC秒数)为无符号整数。

bigint

unix_timestamp(string date)

指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970- 01 – 0100:00:00′到指定日期的秒数。

bigint

unix_timestamp(string date, string pattern)

指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400

string

to_date(string timestamp)

返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″

string

to_dates(string date)

给定一个日期date,返回一个天数(0年以来的天数)

int

year(string date)

返回指定时间的年份,范围在1000到9999,或为”零”日期的0。

int

month(string date)

返回指定时间的月份,范围为1至12月,或0一个月的一部分,如’0000-00-00′或’2008-00-00′的日期。

int

day(string date) dayofmonth(date)

返回指定时间的日期

int

hour(string date)

返回指定时间的小时,范围为0到23。

int

minute(string date)

返回指定时间的分钟,范围为0到59。

int

second(string date)

返回指定时间的秒,范围为0到59。

int

weekofyear(string date)

返回指定日期所在一年中的星期号,范围为0到53。

int

datediff(string enddate, string startdate)

两个时间参数的日期之差。

int

date_add(string startdate, int days)

给定时间,在此基础上加上指定的时间段。

int

date_sub(string startdate, int days)

给定时间,在此基础上减去指定的时间段。

(8) 条件函数

返回类型

函数

说明

T

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。

T

COALESCE(T v1, T v2, …)

返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。

T

CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

当a=b时,返回c;当a=d时,返回e,否则返回f。

T

CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

当值为a时返回b,当值为c时返回d。否则返回e。

(9)字符函数

 

返回类型

函数

说明

int

length(string A)

返回字符串的长度

string

reverse(string A)

返回倒序字符串

string

concat(string A, string B…)

连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串

string

concat_ws(string SEP, string A, string B…)

链接多个字符串,字符串之间以指定的分隔符分开。

string

substr(string A, int start) substring(string A, int start)

从文本字符串中指定的起始位置后的字符。

string

substr(string A, int start, int len) substring(string A, int start, int len)

从文本字符串中指定的位置指定长度的字符。

string

upper(string A) ucase(string A)

将文本字符串转换成字母全部大写形式

string

lower(string A) lcase(string A)

将文本字符串转换成字母全部小写形式

string

trim(string A)

删除字符串两端的空格,字符之间的空格保留

string

ltrim(string A)

删除字符串左边的空格,其他的空格保留

string

rtrim(string A)

删除字符串右边的空格,其他的空格保留

string

regexp_replace(string A, string B, string C)

字符串A中的B字符被C字符替代

string

regexp_extract(string subject, string pattern, int index)

通过下标返回正则表达式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’

string

parse_url(string urlString, string partToExtract [, string keyToExtract])

返回URL指定的部分。parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’

string

get_json_object(string json_string, string path)

select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;

string

space(int n)

返回指定数量的空格

string

repeat(string str, int n)

重复N次字符串

int

ascii(string str)

返回字符串中首字符的数字值

string

lpad(string str, int len, string pad)

返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。

string

rpad(string str, int len, string pad)

返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。

array

split(string str, string pat)

将字符串转换为数组。

int

find_in_set(string str, string strList)

返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。

array<array<string>>

sentences(string str, string lang, string locale)

将字符串中内容按语句分组,每个单词间以逗号分隔,最后返回数组。 例如sentences(‘Hello there! How are you?’) 返回:( (“Hello”, “there”), (“How”, “are”, “you”) )

array<struct<string,double>>

ngrams(array<array<string>>, int N, int K, int pf)

SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;

array<struct<string,double>>

context_ngrams(array<array<string>>, array<string>, int K, int pf)

SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter;

(10)内置的聚合函数(UDAF) 

返回类型

函数

说明

bigint

count(*) , count(expr), count(DISTINCT expr[, expr_., expr_.])

返回记录条数。

double

sum(col), sum(DISTINCT col)

求和

double

avg(col), avg(DISTINCT col)

求平均值

double

min(col)

返回指定列中最小值

double

max(col)

返回指定列中最大值

double

var_pop(col)

返回指定列的方差

double

var_samp(col)

返回指定列的样本方差

double

stddev_pop(col)

返回指定列的偏差

double

stddev_samp(col)

返回指定列的样本偏差

double

covar_pop(col1, col2)

两列数值协方差

double

covar_samp(col1, col2)

两列数值样本协方差

double

corr(col1, col2)

返回两列数值的相关系数

double

percentile(col, p)

返回数值区域的百分比数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。

array<double>

percentile(col, array(p~1,,\ [, p,,2,,]…))

返回数值区域的一组百分比值分别对应的数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。

(11)内置表生成函数(UDTF)

返回类型

函数

说明

数组

explode(array<TYPE> a)

数组一条记录中有多个参数,将参数拆分,每个参数生成一列。

 

json_tuple

get_json_object 语句:select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a; json_tuple语句: select a.timestamp, b.* from log a lateral view json_tuple(a.appevent, ‘eventid’, ‘eventname’) b as f1, f2

(12)自定义函数

自定义函数包括三种UDF、UDAF、UDTF

  • UDF(User-Defined-Function) 一进一出
  • UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min
  • UDTF(User-Defined Table-Generating Functions)&#160; 一进多出,如lateral view explore()

使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数

 (13)常用函数

    trim() # 去除两边空格
  lower(), upper() # 大小写转换
    cast(expr as type) # 类型转换

    length() # 返回字符串长度
  reverse() # 反转字符
  substring(string A, int start, int len) # 字符串截取
    concat(string A, string B, string C, ...) # 字符串连接
  concat_ws(string sep, string A, string B, string C, ...) # 自定义分隔符sep的字符串连接
  str_to_map(string A, string item_pat, string dict_pat) # 将字符串转为map
  
    split(string str, string pat) # 按照pat字符串分割str,返回分割后的字符串数组
  coalesce(v1, v2, v3, ...) # 返回列表中第一个非空元素,如果所有值都为空,则返回null
  from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') # 返回当前时间
  instr(string str, string search_str) # 返回第二个参数在待查找字符串中的位置(找不到返回0)
  map_keys(map m) # 提取出map的key, 返回key的array
  datediff(date1, date2) # 日期比较函数,返回相差天数,datediff('${cur_date},d)
  explode(colname) # explode就是将hive一行中复杂的array或者map结构拆分成多行

六、UDF 开发

 

1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

2、编写UDF函数的时候需要注意一下几点:

  • 自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
  • 需要实现evaluate函数,evaluate函数支持重载。

3、步骤

  • 把程序打包放到目标机器上去;
  • 进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;
  • 创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';
  • 查询HQL语句:

    SELECT add_example(8, 9) FROM scores;

    SELECT add_example(scores.math, scores.art) FROM scores;

    SELECT add_example(6, 7, 8, 6.8) FROM scores;

  • 销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

七、UDAF 自定义集函数

多行进一行出,如sum()min(),用在group  by

1.必须继承

org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)

2.Evaluator需要实现 inititerateterminatePartialmergeterminate这几个函数

init():类似于构造函数,用于UDAF的初始化
iterate():接收传入的参数,并进行内部的轮转,返回boolean
terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner
merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
terminate():返回最终的聚集函数结果

开发一个功能同:

  • Oraclewm_concat()函数
  • Mysqlgroup_concat()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值