hive 如何批量采集行

ih99xse1  于 2023-02-12  发布在  Hive
关注(0)|答案(2)|浏览(125)

我有一个类似这样的表:
| id|values|
| - ------|- ------|
| 1|a|
| 2|b|
| 3|c|
| 4|d|
| 5|x1米11米1x|
| 6|f|
我需要生成group_id列,以便能够使用

select collect_list(values) from table group by group_id

例如,对于batchSize = 2
| id|values|group_id|
| - ------|- ------|- ------|
| 1|a|1|
| x1米20英寸1x|b|1|
| 3|c|2|
| 4|d|2|
| 5|x1米30英寸1x|3|
| 6|f|3|
把它取出来
| group_id|collect_list(values)|
| - ------|- ------|
| 1|[a, b]|
| x1米39英寸|x1米40英寸1x|
| 3|[e, f]|
或者,对于batchSize = 3
| id|values|group_id|
| - ------|- ------|- ------|
| 1|a|1|
| 2|x1米50英寸|1|
| 3|c|1|
| 4|d|2|
| 5|e|x1米60英寸1x|
| 6|f|2|
出局
| group_id|collect_list(values)|
| - ------|- ------|
| 1|[a, b, c]|
| 2|[d, e, f]|
如何生成该列group_id以便收集值并按group_id分组?

cedebl8k

cedebl8k1#

您可以使用row_number和DIV生成group_id
为了扩展我的答案,我们使用Integer division属性来获取组ID
Row_number将给予从1到N的连续数字
但是我们需要数字从0开始,所以我们从行号中减去1

rownumber   Div (3)
0           0
1           0
2           0
3           1
4           1
5           1
6           2

这可以证明对所有无穷大的整数都是正确的
由于group_id必须以1开头(实际上不是必需的),我们需要向结果中添加另一个1
使用生成的Group-id之后,您可以通过collect_list(values) tpo获取您的数组

SELECT
id, `values`,
((ROW_NUMBER() OVER (ORDEr By id) -1)  DIV 3) + 1 group_id
FROM tab1

| 身份证|价值观|组标识|
| - ------|- ------|- ------|
| 1个|项目a|1个|
| 第二章|B|1个|
| 三个|(c)秘书长的报告|1个|
| 四个|日|第二章|
| 五个|电子|第二章|
| 六个|f级|第二章|
| 七|克|三个|
| 八个|小时|三个|
| 九|我|三个|

SELECT
id, `values`,
((ROW_NUMBER() OVER (ORDEr By id) -1) DIV 2) + 1 group_id
FROM tab1

| 身份证|价值观|组标识|
| - ------|- ------|- ------|
| 1个|项目a|1个|
| 第二章|B|1个|
| 三个|(c)秘书长的报告|第二章|
| 四个|日|第二章|
| 五个|电子|三个|
| 六个|f级|三个|
| 七|克|四个|
| 八个|小时|四个|
| 九|我|五个|

iugsix8n

iugsix8n2#

据我所知,你想做的是把你的选择分块。
那么这个应该可以了:https://stackoverflow.com/a/29975781/21188126

相关问题