hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组
Posted
技术标签:
【中文标题】hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组【英文标题】:hive sql - how to select the first n elements in hive array column and return the selected array 【发布时间】:2021-01-11 14:36:31 【问题描述】:请考虑一个 hive 表 - 如下所述的表。
user_id interest_array
tom [a,b,c,d,g,w]
bob [e,d,s,d,g,w,s]
cat [a]
harry []
peter NULL
我想在每行的 'interest_array' 中按顺序选择前 3 个元素并将其作为数组返回,输出如下所示
user_id output_array
tom [a,b,c]
bob [e,d,s]
cat [a]
harry []
peter NULL
PS:最后两行并不重要,它们只是极端情况,如果需要我可以将它们设置为空。
【问题讨论】:
【参考方案1】:1.简单的方法,但是如果初始数组可以包含较少的元素(结果数组将包含NULL),它将无法正常工作。
with mydata as(
select array('a','b','c','d','g','w') as original_array
)
select original_array, array(original_array[0], original_array[1], original_array[2]) as first_3_array
from mydata
结果:
original_array first_3_array
["a","b","c","d","g","w"] ["a","b","c"]
2。使用explode 的另一种方法适用于任何数组:
使用poseexplode分解数组,过滤位置
with mydata as(
select array('a','b','c','d','g','w') as original_array
)
select original_array, collect_list(e.element) as first_3_array
from mydata
lateral view outer posexplode(original_array) e as pos, element
where pos<=2
group by original_array
结果:
original_array first_3_array
["a","b","c","d","g","w"] ["a","b","c"]
3.更高效的方法,无需爆炸: 使用逗号分隔符连接数组,使用正则表达式提取最多包含 3 个第一个元素的子字符串,再次拆分:
with mydata as(
select array('a') as original_array
)
select original_array, split(regexp_replace(regexp_extract(concat_ws(',', original_array),
'^(([^,]*,?)1,3)',1),
',$','') --remove last delimiter
,',') as first_3_array
from mydata
【讨论】:
以上是关于hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组的主要内容,如果未能解决你的问题,请参考以下文章
HIVE:如何仅从两个表中的两列中选择第三个表中不存在的不同值?
如何引用列中的第一个非空字符串 - Cloudera Impala / Apache Hive / Spark SQL