将字符串转换为 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”的主要内容,如果未能解决你的问题,请参考以下文章