将字符串转换为int,即字符串“res”

tyu7yeag  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(413)

表中有一列是 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"]     |

字符串和整数之间存在Map。”res“Map到1,av”Map到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并将字符串重新Map为整数,以便数据跨所有分区?
预期产量:

| 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 . 我希望这有道理。

anauzrmj

anauzrmj1#

CAST(e.api as INT) 如果无法强制转换,则返回null。collect\u list将收集一个包含重复项且不包含空值的数组。如果需要没有重复元素的数组,请使用collect\u 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

相关问题