如何截取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]
相关推荐
随心............5 小时前
sqoop采集完成后导致hdfs数据与Oracle数据量不符的问题。怎么解决?
hive·hadoop·sqoop
随心............1 天前
yarn面试题
大数据·hive·spark
随心............2 天前
在开发过程中遇到问题如何解决,以及两个经典问题
hive·hadoop·spark
yumgpkpm2 天前
CMP (类ClouderaCDP7.3(404次编译) )华为鲲鹏Aarch64(ARM)信创环境 查询2100w行 hive 查询策略
数据库·数据仓库·hive·hadoop·flink·mapreduce·big data
starfalling10244 天前
【hive】一种高效增量表的实现
hive
D明明就是我4 天前
Hive 拉链表
数据仓库·hive·hadoop
嘉禾望岗5034 天前
hive join优化和数据倾斜处理
数据仓库·hive·hadoop
yumgpkpm4 天前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera
忧郁火龙果4 天前
六、Hive的基本使用
数据仓库·hive·hadoop
忧郁火龙果4 天前
五、安装配置hive
数据仓库·hive·hadoop