Hive学习之路 (二十三)Hive 常用的内置函数(补充) posexplode

一、时间区间拆分成单独行

1、天级别:根据指定日期(到天)和结束日期,列出这段时间内的所有明细时间

select tf.*,t.*, date_add(start_date,pos) 
from (
  select 'a' as a, '2018-11-01' as start_date, '2018-12-01' as end_date 
) t 
lateral view posexplode(split(space(datediff(end_date,start_date)),' ')) tf as pos,val limit 5000

在这里插入图片描述

2、秒级别:
如果是对精确到秒的时间段,展开这段时间内的所有的具体时间

select  i, from_unixtime(unix_timestamp(time1)+ pe.i,'yyyyMMddHHmmss') as dynamic_date ,
'2020-11-01 13:01:10' as start_time, '2020-11-01 13:01:20' end_time
from ( select '2020-11-01 13:01:10' time1, '2020-11-01 13:01:20' time2  ) t
lateral view posexpoplode(split(space(cast(unix_timestamp(time2)-unix_timestamp(time1) as int)),' ')) pe as i, x  

在这里插入图片描述

二、数组中的应用

A表(shows表示访问过的城市列表,是有序的)
在这里插入图片描述B表(show表示访问过的城市)

在这里插入图片描述
假设现在需求是:判断B表中访问过的城市在A表shows中的位置。

1、由于A表的shows是数组,所以先用posexplode将A表按shows列展开

 select *  from A LATERAL VIEW posexplode(shows) t as pos, city

得到的结果是如下表,即可以看出按照shows这一列展开了,并且还给出了shows中元素的位置(第三列)

在这里插入图片描述
下面merge A表和B表,找到B表中访问过的城市在A表shows中的位置

select T2.city, T2,pos
 
        (select * from B) T1
 
        left outer join
 
        (select * from A LATERAL VIEW posexplode(shows) t as pos , city_single) T2
 
        on T1.id = T2.id and T1.city = T2.citys_single

merge后得到的结果是
在这里插入图片描述
Hive之 explode和 posexpolode更详细的教程

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值