[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLNZZpD2-1594372217088)(image\hive查看表数据条数.png)]
select cout(id) from ods_access where month='12'
union all
select cout(id) from ods_access where month='11'
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";
使用临时表的时候大多是基于其他查询的中间结果进行多次计算的场景,比如:我的三个查询结果都是基于某个前置的统计结果进行的,那个可以将之前的查询结果做成一个临时表,这样在后面查询的时候就可以避免进行重复的操作。
inner join 使用的时候主要是基于笛卡尔积进行操作才是用inner join ,当需要使用笛卡尔积进行运算的时候才使用innerjoin
a row_number rank dense_rank
A 1 1 1
C 2 2 2
D 3 3 3
B 4 3 3
E 5 5 4
F 6 6 5
G 7 7 6
row_number 不管排名是否有相同的,都按照顺序1,2,3……n
rank:排名相同的名次一样,同一排名有几个,后面排名就会跳过几次
dense_rank:排名相同的名次一样,且后面名次不跳过
日期函数:
date_format(visitDate,'YYYY-MM') mn
select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss'); --日期字符串必须满足yyyy-MM-dd格式
结果:2017-01-01 00:00:00
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
select current_date();
结果:2020-01-01
select unix_timestamp();
结果:1577858367
select current_timestamp();
结果:2020-01-01 13:52:46.018
select unix_timestamp('2020/01/01','yyyy/MM/dd');
结果:1577808000
select from_unixtime(1517725479,'yyyy-MM-dd HH:dd:ss');
select from_unixtime(1517725479,'yyyyMMdd');
结果:2018-02-04 14: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;
select hour(‘2020-07-10 11:32:12’);
结果:11
select datediff(‘2020-04-09’,‘2020-04-01’);
结果:8
Hive中取最近30天数据
datediff(CURRENT_TIMESTAMP ,create_time)<=30
Hive中 两个日期相差多少小时
select (unix_timestamp(‘2018-05-25 12:03:55’) - unix_timestamp(‘2018-05-25 11:03:55’))/3600
其他常用函数:
regexp_replace(visitDate,'/','-')
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(param1,"$.param2")
处理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;
把同一个分组不同行的数据聚合成为一个集合,用下标可以取某一个
对于非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
select date_fromat('2019-02-19','yyyy-MM');
result:2019-02
select date_add('2019-02-10',-1);
result:2019-02-09
select next_day('2019-02-10','Mo');---取当前周的下一个周一
result:2019-02-08
select date_add(next_day('2019-02-10','Mo'),-7); ---取当前周的周一
select last_day('2019-02-10');---取当前月份的最后一天
result:2019-02-28