我在一个表中有一列,类型是 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
. 我希望这有意义。
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