我是 Presto 新手,我们公司数据仓库中有一张表(表名:dwd_user_country),记录了用户到访过的国家与地区。这里为简化问题描述,将该表结构抽象为两个字段:user_id 和 countries,其中 countries 字段的值采用英文逗号连接用户到访过的国家与地区。

表数据如下表所示:

user_id countries
26841018 中国,马来西亚,美国,瑞士,泰国,冰岛

现在,我需要从该表中统计每个国家或地区的到访人数,在 Hive 语法中,我可以使用 LATERAL VIEW EXPLODE 将该表的数据转成以下格式,再按 country 字段做 GROUP BY 统计。如果现在是使用 Presto 该怎么做呢?

user_id country
26841018 中国
26841018 马来西亚
26841018 美国
26841018 瑞士
26841018 泰国
26841018 冰岛

Hive 查询

首先使用 split 函数将 countries 字段分割成数组,再使用 lateral view explode() 将数组炸开:

1
2
3
4
-- hive
select t1.user_id,
t2.country
from dwd_user_country t1 lateral view explode(split(t1.countries, ',')) t2 as country

Presto 查询

首先使用 split 函数将 countries 字段分割成数组,再使用 cross join unnest() 将数组炸开:

1
2
3
4
5
-- presto
select t1.user_id,
t2.country
from dwd_user_country t1
cross join unnest(split(countries, ',')) as t2(country)

t2 是由 cross join unnest() 隐式创建的表的别名。因此,可以在 SELECT 语句中将 country 写成 t2.country。

(END)