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

Posted

技术标签:

【中文标题】将字符串转换为 int 即字符串“res”【英文标题】:Casting string to int i.e. the string "res" 【发布时间】:2020-06-08 14:29:33 【问题描述】:

我在表中有一个类型为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,等等。但是,我编写了一个查询来执行一些逻辑。这是它的一个 sn-p(子查询):

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 中都有整数。我希望这是有道理的。

【问题讨论】:

"res" 映射到 1,"res" 映射到 2 等等。???你需要 1 av 和 2 的 res 吗?等是什么意思?如何知道什么是什么? 应该是“res 映射到 1 和 av 映射到 2 等”。现已更正 使用 IsNumeric 函数。 IE。 CASE WHEN IsNumeric(e.con) THEN cast ELSE convert END 你不能将字符串替换为派生列中的数字 可能,这是我的问题:) 【参考方案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

【讨论】:

以上是关于将字符串转换为 int 即字符串“res”的主要内容,如果未能解决你的问题,请参考以下文章

怎么将字符串类型转换成int型?初学者简单方法

python 中将str类型转化为int

C语言如何将int类型转换成字符串

char *怎样转成int

(在线等)js怎样将字符串类型转换为int类型

c# string转int的方法