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

Hive 选择行,其中 A 列中的字符串包含 B 列中的字符串

如何在 Hive 中调用用户定义的函数?

SQL 计算基于 Hive 列中先前值重置的累积总和

Hive 数组类型的求和值