在配置单元中将字符串数组转换为 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"]
我正在尝试通过保持原始顺序将字符串数组转换为 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"]