需求
现有如下数据表 table_1
a | b |
a1 | 3 |
a2 | 2 |
a3 | 1 |
想要得到的结果表为 table_2
a | b |
a1 | 3 |
a1 | 3 |
a1 | 3 |
a2 | 2 |
a2 | 2 |
a3 | 1 |
方案
从表 table_1 到 table_2,实际就是对数据按照 b 列的取值进行展开,如 b 列取值为 3 时所在行展开为 3 行。分析思路如下:
- 我们首先想到的是
explode
函数有此功能,这样新问题是 explode 接受的参数为array
,因此需要构造一个给定大小的数组 - 构造一个给定大小的数组,这里给出的方案是结合字符串 udf 函数
split
和repeat
,具体 sql 如下:
select a, b
from table_1
lateral view explode(split(repeat('a', b-1), 'a')) mtb as cc
总结
- hive 构造给定大小的数组过程中,使用到了 2 个字符串 udf 函数
split
和repeat
- 注意
repeat
函数中长度要 -1