hive使用笔记

1.解析json

使用函数 json_tuple,函数参数用法:

json_tuple(json_object,'key1','key2','keyN')

函数使用方法:

select T1.key1,T1.key2,jf_key1,jf_key2
from table1 T1 

lateral view json_tuple(json_field_name,'key1','key2') jf as jf_key1,jf_key2

2.多个表按key聚合

例如:

A表:设备的rom升级版本

device_id,time,rom_version

B表:设备的app升级版本

device_id,time,app_version

C表:统计设备今日的rom版本,app版本

device_id,rom_version,app_version

HQL:

SELECT IF(A.device_id is not null,A.device_id,B.device_id) device_id,

IF(A.device_id is not null,A.rom_version,'') rom_version,

IF(B.device_id is not null,B.app_version,'') app_version

FROM (

SELECT device_id,rom_version

FROM device_rom_upgrade

where ds=20180108

) A

full outer join

(

SELECT device_id,app_version

 

FROM device_app_upgrade

where ds=20180108

)B on (A.device_id=B.device_id)

 

3.取最近的一条升级记录

SELECT A.device_id,A.rom_version,A.time,A.row_num

FROM

(

SELECT device_rom_upgrade .*,row_number() over(partition by device_id order by time desc) row_num

FROM device_rom_upgrade

)A where A.row_num=1

4.多个select结果join

例如:统计

select A.field1,A.field2,B.field1,B.field2  

from 

        (
        select field1,field2

from table1

where condition
        )A
        left join
        (
       

select field1,field2

from table2

where condition


        )B

 

        on (A.field1=B.field1)

 

注意事项:hive小于2.2.0时, on 里面的条件只能是=或<>,不能是>或<

参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

5. hive中解析json数组

例如表A的param字段为json格式的字符串,其json格式如下

{

"arry_key":

[

{

"arr_obj_key1":"arry_obj_value1",

"arr_obj_key2":"arry_obj_value2"

},

{

 

}

],

"key1":"value1",

"key2":"value2"

}

解析方法:

1)先用json_tuple取出param

2)使用正则表达式抠出数组中的对象[{},{}],用split把对象分成数组;

3)用explode打成多行

4)最后再通过json_tuple取出数组对象里面的值

select A.key1,A.key2,array_inner_obj.arr_obj_key1,array_inner_obj.arr_obj_key2,p.key1,p.key2
from A
lateral view json_tuple(params,'arry_key','key1','key2') p as p_arry,key1,key2
lateral view posexplode(split(regexp_replace(regexp_replace(p.p_arry,'\\\\}\\\\,\\\\{','\\\\}\\\\|\\\\|\\\\{'),'\\\\[|\\\\]',''), '\\\\|\\\\|')) p_arry as p_array_index, array_element
lateral view json_tuple(p_arry.array_element,'arr_obj_key1','arr_obj_key2') array_inner_obj as arr_obj_key1,arr_obj_key2
where A.ds=20180110

参考http://blog.csdn.net/lfq1532632051/article/details/63262519

注意事项:

1) hive中使用\转义时要使用4个\,例如"\N" ,需要输入"\\\\N"

2) insert overwrite会先清空原来的数据,再插入新数据。

6.带条件计数

count()函数里面想实现带条件统计,可以使用SUM函数来进行替换,具体可以使用case when 语句或者Decode函数来对要统计的数据进行0、1转换, 


如下例子: 
SELECT s.user_id,SUM(case(m.is_success) when 1 then 1 else 0 end),SUM(case when m.read_time IS NULL  then 0 else 1 end),COUNT(*) 
from doc_score s,mail_send_log m where s.user_id in(6,7,8,9) and s.status = 1 and m.doc_id = s.doc_id 
group by s.user_id 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值