前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hive使用笔记

hive使用笔记

作者头像
用户1396155
发布2018-08-02 16:03:38
1.5K0
发布2018-08-02 16:03:38
举报
文章被收录于专栏:IT探索IT探索

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版本

代码语言:javascript
复制
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.取最近的一条升级记录

代码语言:javascript
复制
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

例如:统计

代码语言:javascript
复制
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格式如下

代码语言:javascript
复制
{
"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会先清空原来的数据,再插入新数据。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年12月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档