HiveExplode - huangyuefeng/study GitHub Wiki
Hive技术explode求解救
- 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,检查对应的结果。