将字符串转为int,即字符串 "res"。

问题描述 投票:0回答:1

我在一个表中有一列,类型是 array<string>. 该表每天分区,因为 2018-01-01. 在某些阶段,数组中的值从字符串变成了整数。数据看起来像这样。

| yyyy_mm_dd | h_id  | p_id | con           |
|------------|-------|------|---------------|
| 2018-10-01 | 52988 | 1    | ["res", "av"] |
| 2018-10-02 | 52988 | 1    | ["1","2"]     |
| 2018-10-03 | 52988 | 1    | ["1","2"]     |

字符串和整数之间有一个映射。"res "映射为1,"av "映射为2等等。然而,我已经写了一个查询来执行一些逻辑。这里是它的一个片段(子查询)。

SELECT
    t.yyyy_mm_dd,
    t.h_id,
    t.p_id,
    CAST(e.con AS INT) AS api
FROM
    my_table t
    LATERAL VIEW EXPLODE(con) e AS con

我的问题是,这对早期的日期不起作用,因为当时使用的是字符串而不是整数。有没有办法选择con,并将字符串重新映射为整数,从而使数据跨越所有分区?

预期的输出。

| yyyy_mm_dd | h_id  | p_id | con           |
|------------|-------|------|---------------|
| 2018-10-01 | 52988 | 1    | ["1","2"]     |
| 2018-10-02 | 52988 | 1    | ["1","2"]     |
| 2018-10-03 | 52988 | 1    | ["1","2"]     |

一旦选择的值都是整数(在一个字符串数组中),那么... ... CAST(e.con AS INT) 行得通

编辑。 为了澄清,我将把解决方案作为一个子查询,然后再使用。lateral view explode. 这样我就在一个表上爆炸,所有的分区都有整数。con. 我希望这有意义。

sql hive hiveql
1个回答
1
投票

CAST(e.api as INT) 如果无法投递,则返回NULL.collect_list将收集一个包含重复元素且没有NULL的数组。如果你需要没有重复元素的数组,使用 collect_set()。

SELECT
    t.yyyy_mm_dd,
    t.h_id,
    t.p_id,
    collect_list(--array of integers 
                 --cast case as string if you need array of strings
                CASE WHEN e.api  = 'res' THEN 1   
                     WHEN e.api  = 'av'  THEN 2  
                     --add more cases   
                     ELSE CAST(e.api as INT)
                 END
                ) as con
FROM
    my_table t
    LATERAL VIEW EXPLODE(con) e AS api
GROUP BY t.yyyy_mm_dd, t.h_id, t.p_id
© www.soinside.com 2019 - 2024. All rights reserved.