如何截取Hive数组中的前N个元素?

文章目录

1、需求描述

需求:截取任意给定数组中的前N个元素,返回截取后的子数组

假设我们有如下三种类型的Hive数组:

sql 复制代码
select array(1,2,3,4)            -- [1,2,3,4]
select array(1,2,3,NULL)         -- [1,2,3,null]
select split('123', space(0))    -- [1,2,3,]

现在,我们要截取上述数组中的前三个元素,那么应该怎么操作呢?

可以尝试以下几种方案

2、使用索引

方式1:使用索引逐个取值,再收集到新的数组

sql 复制代码
with t as (select split('123', space(0)) as arr)
select array(arr[0],arr[1],arr[2]) from t     -- [1,2,3]

-- 如果初始数组中包含NULL,使用下标取元素时,NULL将会被放在最前面的位置
with t as (select array(1,2,3,NULL) as arr)
select array(arr[1],arr[2],arr[3]) from t     -- [1,2,3]

3、使用posexplode()

方式2:使用posexplode()分解数组,过滤pos<=N,再收集到新的数组

sql 复制代码
with t as (select split('123', space(0)) as arr)
select collect_list(tmp.ele) from t
lateral view outer posexplode(arr) tmp as pos,ele
where pos < 3
group by arr     -- [1,2,3]

4、转换为字符串操作

方式3:先转换为字符串,再截取特定长度后转换为数组

数组转换为字符串后的总长度计算公式:

python 复制代码
size(arr)+(size(arr)-1)

数组去除前N个元素剩余元素转换为字符串的长度计算公式:

python 复制代码
(size(arr)-N)*2

则需要截取的前N个元素转换成字符串的长度计算公式为:

python 复制代码
(size(arr)+(size(arr)-1))-(size(arr)-N)*2 = 2*N-1
sql 复制代码
with t as (select split('1,2,3,4', ',') as arr)
select split(substring(concat_ws(',',arr), 0, 2*3-1), ',')
from t           -- [1,2,3]

with t as (select split('123', space(0)) as arr)
select split(substring(concat_ws(',',arr), 0, 2*3-1), ',')
from t           -- [1,2,3]
相关推荐
隐于花海,等待花开7 小时前
Hive 常用函数详细总结
数据仓库·hive·hadoop
隐于花海,等待花开2 天前
COLLECT_LIST函数详解
hive
隐于花海,等待花开2 天前
数据开发常问的技术性问题及解答
大数据·hive
隐于花海,等待花开2 天前
窗口函数之排序函数详细解读及示例
大数据·数据库·hive
隐于花海,等待花开2 天前
Hive 正则函数详解与示例
数据仓库·hive·hadoop
隐于花海,等待花开2 天前
Hive专题:数据开发面试高频题(TopN、留存、连续登录等)
hive·hadoop·面试
Hadoop_Liang3 天前
Hive的ORDER BY、SORT BY、DISTRIBUTE BY、CLUSTER BY对比及案例实践
数据仓库·hive·hadoop
杭州杭州杭州4 天前
数仓实验1
hive
杭州杭州杭州4 天前
数仓实验2
hive
杭州杭州杭州4 天前
数仓实验3
hive