如何截取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]
相关推荐
AllData公司负责人15 小时前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析
泰克教育官方账号17 小时前
泰涨知识 | Hive集群环境部署
数据仓库·hive·hadoop
婉然从物19 小时前
Flink SQL 元数据持久化实战:从“每次重启表消失”到“Hive Metastore 永久存储”
hive·sql·flink
龙石数据1 天前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
心中有国也有家1 天前
E-Brufen 技术选型全景:Flutter + 鸿蒙 + Hive CE
hive·hadoop·学习·flutter·华为·harmonyos
DataPulse*2 天前
Hive常用参数调优十二板斧
hive·hadoop·硬件架构
TTBIGDATA2 天前
【Ambari Plus】12.Flink 安装
hive·hadoop·flink·ambari·hdp·cdh·bigtop
心中有国也有家2 天前
Flutter 鸿蒙适配第一步:从 hive 迁移到 hive\_ce
hive·学习·flutter·华为·harmonyos
心中有国也有家3 天前
鸿蒙 Flutter 本地存储实战:Hive CE 从入门到精讲
人工智能·hive·flutter·华为·harmonyos
AllData公司负责人3 天前
AIIData数据中台集成OpenMetadata开源项目,成功运行Hive数据血缘拾取任务,支持库级别+表级别+字段级血缘!
大数据·数据库·数据仓库·人工智能·hive·hadoop·开源