HiveExplode - huangyuefeng/study GitHub Wiki

Hive技术explode求解救

src_url

  • explode怎么用

笔者用explode,一种特定的UDTF来举例子,有个文件,里面2列用\t分割,game_id和user_ids。 user_ids用[[[分隔。这个数据很好理解,意思是两个用户winning1ren和13810537508一起玩了把game66。

hive> select * from login_game_log ;

OK
game66       winning1ren[[[13810537508
game101       15358083654[[[ab33787873[[[zjy18052480603[[[shlg1881826[[[lxqab110
game101       hu330602003[[[hu330602004[[[hu330602005[[[15967506560

当我们想对hive表中某一列进行split之后,想对其转换成1 to N的模式,即一行转多列。下面语句可以实现这个功能:

select explode(split(user_ids,'\\[\\[\\[')) as user_id   from login_game_log  
where dt='2018-08-18' 
  • explode求解救

一个很常见的需求,我们希望处理后的数据如下,

game101       hu330602003
game101       hu330602004
game101       hu330602005
game101       15967506560
game101       15358083654
game101       ab33787873
game101       zjy18052480603
game101       shlg1881826
game101       lxqab110
game66       winning1ren
game66       13810537508

问题就来了,hive不允许我们在UDTF函数之外,再添加其它select字段,比如game_id。 如下,我们想将登录某个游戏的用户id放在一个字段user_ids里,对每一行数据用UDTF后输出多行。

select game_id, explode(split(user_ids,'\\[\\[\\[')) as user_id   from login_game_log  
where dt='2018-08-18'  
FAILED: Error in semantic analysis: UDTF's are not supported outside the SELECT clause, nor nested in expressions。

这个功能叫做UDTF的conjunction,怎么解决这个问题,请看下一篇

Hive技术LateralView横空出世解救explode

  • 来个题目

把本节用到的数据load到hive表里, 运行对应HQL,检查对应的结果。