Hive中常⽤函数
Hive 查看表数据条数
⽅法⼀:在hue界⾯的hive下到相应的表,即可看到表的⾏数和⼤⼩等信息。
⽅法⼆:利⽤分区来查,通过计算每个分区的数据量来汇总得到最终的数据量
select cout(id)from ods_access where month='12'
union all
select cout(id)from ods_access where month='11'
数据量⼩的情况下采⽤count(id)直接进⾏查询
select count(id)from ods_access
采⽤查询元数据的⽅式
select*from TBLS where TBL_NAME='call_center';
select a.TBL_ID, a.TBL_NAME, b.PARAM_KEY, b.PARAM_VALUE
from TBLS as a
join TABLE_PARAMS as b
where a.TBL_ID = b.TBL_ID and TBL_NAME="web_sales"and PARAM_KEY="numRows";
临时表的使⽤场景
使⽤临时表的时候⼤多是基于其他查询的中间结果进⾏多次计算的场景,⽐如:我的三个查询结果都是基于某个前置的统计结果进⾏的,那个可以将之前的查询结果做成⼀个临时表,这样在后⾯查询的时候就可以避免进⾏重复的操作。
InnerJoin的使⽤场景
inner join 使⽤的时候主要是基于笛卡尔积进⾏操作才是⽤inner join ,当需要使⽤笛卡尔积进⾏运算的时候才使⽤innerjoin
row_number、rank、dense_rank 区别
a  row_number  rank    dense_rank
A      111
C      222
D      333
B      433
E      554
F      665
G      776
row_number 不管排名是否有相同的,都按照顺序1,2,3……n
rank:排名相同的名次⼀样,同⼀排名有⼏个,后⾯排名就会跳过⼏次
dense_rank:排名相同的名次⼀样,且后⾯名次不跳过
Hive常⽤函数
⽇期函数:
date_format 函数,⽤于⽇期转换,将给定原格式的⽇期转换成为⽬标格式
date_format(visitDate,'YYYY-MM') mn
select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss');--⽇期字符串必须满⾜yyyy-MM-dd格式
结果:2017-01-0100:00:00
date_add、date_sub函数(加减⽇期)
select date_add('2019-01-01',1);--字符串必须满⾜yyyy-MM-dd格式
结果:2019-01-02
select date_sub('2019-01-01',1);  --字符串必须满⾜yyyy-MM-dd格式
结果:2018-12-31
current_date() 得到当前⽇期的字符串
select current_date();
结果:2020-01-01
unix_timestamp() 得到当前⽇期的时间戳
select unix_timestamp();
结果:1577858367
current_timestamp() 得到当前的时间字符串
select current_timestamp();
结果:2020-01-01 13:52:46.018
unix_timestamp(‘⽇期字符串’,‘pattern’)把指定格式的⽇期转换成时间戳
select unix_timestamp('2020/01/01','yyyy/MM/dd');
结果:1577808000
from_unixtime(‘bigint时间戳’,‘pattern’)将时间戳转换成为指定格式的⽇期字符串
select from_unixtime(1517725479,'yyyy-MM-dd HH:dd:ss');
select from_unixtime(1517725479,'yyyyMMdd');
结果:2018-02-0414:04:39
20180204
注意:通常把unix_timestamp 和from_unixtime 结合使⽤,先⽤unix_timestamp 将指定格式的⽇期字符串转换成为时间戳格式,然后再使⽤from_unixtime将时间戳转换成为⽬标的⽇期字符串格式
20171205转成2017-12-05
select from_unixtime(unix_timestamp(‘20171205’,‘yyyymmdd’),‘yyyy-mm-dd’) from dual;
hour 返回⽇期中的天,minute、day、month、year的⽤法类似
select hour(‘2020-07-1011:32:12’);
结果:11
datediff (‘开始⽇期’,‘结束⽇期’) 返回开始⽇期减去结束⽇期的天数
select datediff(‘2020-04-09’,‘2020-04-01’);
结果:8
Hive中取最近30天数据datediff是字符型函数
datediff(CURRENT_TIMESTAMP,create_time)<=30
Hive中 两个⽇期相差多少⼩时
select(unix_timestamp(‘2018-05-2512:03:55’)- unix_timestamp(‘2018-05-2511:03:55’))/3600
其他常⽤函数:
regexp_replace 字符串替换函数,将源字符替换成为⽬标字符
regexp_replace(visitDate,'/','-')
explode爆炸函数,将数据炸开
select explode(score)as(course,score)from score;
原数据格式:
score.name score.score
peck {"math":90,"english":100,"sport":80}
alice {"math":80,"english":99,"sport":85}
tom    {"math":62,"english":99,"sport":88}
转换后的格式:
select explode(score)as(course,score)from score;
hive (default)>select explode(score)as(course,score)from score;
course score
math 90
english 100
sport 80
math 80
english 99
sport 85
math 62
english 99
sport 88
get_json_object (解析json)
get_json_object(param1,"$.param2")
param1:需要被解析的json字段
param2:数组就⽤ [0,1,2…] 0,1,2是数组对应的元素,遇若jsonObject直接⽤ ".key"取出想要获取的value。处理jsonArray(json数组),如person表的pjson字段有数据:[{"name":"Tom","sex":"男","age":"22"},{"name":"Jack","sex":"⼥"age":"32"}]
1、如果需要获取第⼀个json对象,hive语句如下
SELECT get_json_object(pjson,"$.[0]") FROM person;
得到第⼀个json对象
{"name":"Tom","sex":"男","age":"22"}
2、如果要获取第⼀个json对象中的name属性的值:
SELECT get_json_object(pjson,"$.[0].age") FROM person;
collect_set()
把同⼀个分组不同⾏的数据聚合成为⼀个集合,⽤下标可以取某⼀个
对于⾮group by字段,可以⽤Hive的collect_set函数收集这些字段,返回⼀个数组;select course,collect_set(area),avg(score) from student group by course;
result: chinese  ["sh","bj"]89
math    ["bj"]90
⽇期处理函数
1.date_fromat()
select date_fromat('2019-02-19','yyyy-MM');
result:2019-02
2.date_add()
select date_add('2019-02-10',-1);
result:2019-02-09
<_day()
select next_day('2019-02-10','Mo');---取当前周的下⼀个周⼀
result:2019-02-08
select date_add(next_day('2019-02-10','Mo'),-7);---取当前周的周⼀
4.last_day()
select last_day('2019-02-10');---取当前⽉份的最后⼀天
result:2019-02-28

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。