在配置单元中将字符串数组转换为 int 数组时保留顺序

Preserve order while converting string array into int array in hive

我正在尝试通过保持原始顺序将字符串数组转换为 int 数组 这是我的数据示例:

id       attribut                       string_array
id1      attribut1, 10283:990000       ["10283","990000"]
id2      attribut2, 10283:36741000     ["10283","36741000"]
id3      attribut3, 10283:37871000     ["10283","37871000"]
id4      attribut4, 3215:90451000      ["3215","90451000"]

下面是我如何将字段“string_array”转换为整数数组

select  
id, 
attribut,
string_array,
collect_list(cast(array_explode as int)),
from table
lateral view outer explode(string_array) r as array_explode

它给了我:

id       attribut                        string_array              int_array
id1      attribut1,10283:990000         ["10283","990000"]        [990000,10283]
id2      attribut2,10283:36741000       ["10283","36741000"]      [10283,36741000]
id3      attribut3,10283:37871000       ["10283","37871000"]      [37871000,10283]
id4      attribut4,3215:90451000        ["3215","90451000"]       [90451000,3215]

如您所见,“int_array”中没有保留“字符串数组”中的顺序,我需要它与“string_array”中的顺序完全相同。 有人知道如何实现吗?

如有任何帮助,我们将不胜感激

对于 Hive:使用 posexplode,在 collect_list 之前的子查询中按 id 分布按位置排序

select  
id, 
attribut,
string_array,
collect_list(cast(element as int)),
from
(select * 
  from table t
       lateral view outer posexplode(string_array) e as pos,element 
  distribute by t.id, attribut, string_array -- distribute by group key
  sort by pos        -- sort by initial position
) t
group by id, attribut, string_array

另一种方法是从您的属性中提取子字符串并在不爆炸的情况下拆分(如您在评论中所问)

select split(regexp_extract(attribut, '[^,]+,(.*)$',1),':')

正则表达式 '[^,]+,(.*)$' 表示:

[^,]+ - 不是逗号 1+ 次 , - 逗号 (.*)$ - 在逗号之后捕获第 1 组中的所有其他内容,直到字符串结尾

演示:

select split(regexp_extract('attribut3,10283:37871000', '[^,]+,(.*)$',1),':')

结果:

["10283","37871000"]