在配置单元中使用 wm_concat 时,如何用 0 填充不存在的值?
How can I fill non-exist value with 0 when use wm_concat in hive?
我有一个按 pt 分区的 table。
数据:
k v pt
100 1 20150101
101 1 20150102
100 1 20150103
我想使用 wm_concat 得到这样的结果,其中分区中不存在的 k 填充为 0:
k ts
100 1,0,1
101 0,1,0
但我只能得到这样的结果:
k ts
100 1,1
101 1
Hive脚本如下:
select m1.k, wm_concat(',', m1.v) as ts
from
(
select k, v, pt
from test_table
where pt <= ${date}
order by pt
) m1
group by m1.k
完成此操作的一种方法是首先对不同分区的子查询进行交叉连接,并计算一个新的 "v" 列,当特定 k 和 a 的 pt 存在时,该列的值为 1否则为 0 值。然后你需要为每个 k, v 对分组取最大值。这就是我的意思:
select k, max(if(pt_join.pt == tb.pt, 1, 0)) as v, pt_join.pt as pt
from test_table tb
cross join (select distinct pt
from test_table) pt_join
group by k, pt_join.pt
这将输出以下内容:
k v pt
100 1 20150101
100 0 20150102
100 1 20150103
101 0 20150101
101 1 20150102
101 0 20150103
那么你应该可以用你上面的方法得到你想要的结果:
k ts
100 1,0,1
101 0,1,0
我有一个按 pt 分区的 table。 数据:
k v pt
100 1 20150101
101 1 20150102
100 1 20150103
我想使用 wm_concat 得到这样的结果,其中分区中不存在的 k 填充为 0:
k ts
100 1,0,1
101 0,1,0
但我只能得到这样的结果:
k ts
100 1,1
101 1
Hive脚本如下:
select m1.k, wm_concat(',', m1.v) as ts
from
(
select k, v, pt
from test_table
where pt <= ${date}
order by pt
) m1
group by m1.k
完成此操作的一种方法是首先对不同分区的子查询进行交叉连接,并计算一个新的 "v" 列,当特定 k 和 a 的 pt 存在时,该列的值为 1否则为 0 值。然后你需要为每个 k, v 对分组取最大值。这就是我的意思:
select k, max(if(pt_join.pt == tb.pt, 1, 0)) as v, pt_join.pt as pt
from test_table tb
cross join (select distinct pt
from test_table) pt_join
group by k, pt_join.pt
这将输出以下内容:
k v pt
100 1 20150101
100 0 20150102
100 1 20150103
101 0 20150101
101 1 20150102
101 0 20150103
那么你应该可以用你上面的方法得到你想要的结果:
k ts
100 1,0,1
101 0,1,0