需求

现有如下数据表 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 行。分析思路如下:

  1. 我们首先想到的是 explode 函数有此功能,这样新问题是 explode 接受的参数为 array,因此需要构造一个给定大小的数组
  2. 构造一个给定大小的数组,这里给出的方案是结合字符串 udf 函数 splitrepeat,具体 sql 如下:
select a, b 
from table_1
lateral view explode(split(repeat('a', b-1), 'a')) mtb as cc

总结

  1. hive 构造给定大小的数组过程中,使用到了 2 个字符串 udf 函数 splitrepeat
  2. 注意 repeat 函数中长度要 -1