当前位置: 首页 > news >正文

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

文章目录

    • 1、需求描述
    • 2、使用索引
    • 3、使用posexplode()
    • 4、转换为字符串操作



1、需求描述


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

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

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:使用索引逐个取值,再收集到新的数组

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,再收集到新的数组

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:先转换为字符串,再截取特定长度后转换为数组

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

size(arr)+(size(arr)-1)

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

(size(arr)-N)*2

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

(size(arr)+(size(arr)-1))-(size(arr)-N)*2 = 2*N-1
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]

http://www.lryc.cn/news/258092.html

相关文章:

  • iPaaS架构深入探讨
  • UE4/UE5 修改/还原场景所有Actor的材质
  • Three.js + Vue 处理glb文件过大问题(DRACOLoader加载压缩glb)
  • ICC2:low power与pg strategy(pg_mesh)
  • Python基础期末复习 新手
  • 建筑可视化数据大屏汇总,UI源文件(PC端大屏设计)
  • 万户协同办公平台ezoffice wpsservlet接口任意文件上传漏洞
  • ​shelve --- Python 对象持久化​
  • web服务器之——搭建两个基于不同端口访问的网站
  • 如何使用GaussDB创建外表(FOREIGN TABLE)
  • 服务器数据恢复—raid5少盘状态下新建raid5如何恢复原raid5数据?
  • 软件工程 考试重点
  • swing快速入门(六)
  • 《opencv实用探索·十四》VideoCapture播放视频和视像头调用
  • Vue中$props、$attrs和$listeners的使用详解
  • 爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发
  • Pytest+Allure生成自动化测试报告!
  • HTMLTestRunner
  • ELK架构监控MySQL慢日志
  • Linux命令---关机
  • 点云从入门到精通技术详解100篇-基于拓扑约束的3D点云实例分割(续)
  • java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试
  • Java之时间类2(JDK8新增)
  • MySQL InnoDB Replication部署方案与实践
  • 进程的同步和异步、进程互斥
  • 搞定课件录制,新手必备指南!
  • DevOps搭建(九)-Jenkins实现基础CI、CD详细操作
  • 十指波课堂:让学习编程不再是难事
  • IDEA卡顿,进行性能优化设置(亲测有效)——情况二
  • 利用Python和OpenCV实现将图像识别为Excel表格的便捷方法