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会先清空原来的数据,再插入新数据。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维技术迷

连仕彤博客[Python笔记] Python 一次性替换多个字符

在一个字符串中,一次性替换多个字符串,可以使用字符串的replace函数来处理(目前我想到的是这个方法,大神请指教!) 要求 把INSERT语句中的riqi、b...

3595
来自专栏行者常至

数据库的三范式是什么?

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)

783
来自专栏V站

Python的flask:models.py来创建mysql数据库

4176
来自专栏禹都一只猫博客

Python的flask:models.py来创建mysql数据库

2066
来自专栏张善友的专栏

使用 SQL Server 2008 数据类型-xml 字段类型参数进行数据的批量选取或删除数据

我们经常有这样的需求,批量的删除或者选取大量的数据,有非常多的Id值,经常使用in条件查询,如果你使用拼接字符串的方式,可能遭遇SQL语句的长度限制4000个字...

2669
来自专栏北京马哥教育

10分钟学会理解和解决MySQL乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案。在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符...

3018
来自专栏xingoo, 一个梦想做发明家的程序员

【设计模式】—— 单例模式Singleton

  模式意图   保证类仅有一个实例,并且可以供应用程序全局使用。为了保证这一点,就需要这个类自己创建自己的对象,并且对外有公开的调用方法。   模式结构 ? ...

1887
来自专栏Android干货

浅谈Android数据库DBFlow

2655
来自专栏Phoenix的Android之旅

Java 单例的五种写法

单例的目的是为了保证某个类只实例化一个对象。对于我们来说,理解这些单例写法的不同点,最好的方法是明白他们在什么情况下会失效。

1251
来自专栏coder修行路

Go基础之--操作Mysql(二)

在上一篇文章中主要整理了Golang连接mysql以及一些基本的操作,并进行了大概介绍,这篇文章对增删查改进行详细的整理 读取数据 在上一篇文章中整理查询数据...

5746

扫码关注云+社区

领取腾讯云代金券