首页 > 解决方案 > 使用 SerDe 属性将 Athena 上的两列映射为一列

问题描述

我正在尝试使用 JsonSerDe 属性将 Athena 上的两列映射为一列。

在这种情况下,我想将两列conversionsRate以及cr从 jsons 1 和 2 映射到列cr_new(就像合并一样)。

json1

{
  "deviceType": "TABLET",
  "day": "2018-10-27",
  "conversionsRate": 0,
  "clicksCount": 3
}

json2

{
  "deviceType": "TABLET",
  "day": "2018-10-29",
  "cr": 2,
  "clicksCount": 5
}

Athena 的预期结果:

|deviceType|day       |cr_new|clicksCount|
|TABLET    |2018-10-27|0     |3          |
|TABLET    |2018-10-29|2     |5          |

是否可以使用 SerDe 在 athena 表映射上实现这样的结果?

标签: jsonhiveamazon-athenahive-serdehiveddl

解决方案


JSON SerDe 不强制(限制)表 DDL 中定义的列应该存在于 JSON 记录中。如果没有这样的属性,JSONSerDe 将返回 NULL。因此,您可以定义两个列并在查询中应用合并:

CREATE EXTERNAL TABLE json_table (
  devicetype      string,
  `day`           date,
  cr              int,
  conversionsrate int,
  clickscount     int
 )
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
 LOCATION 's3://bucket/path/'; --JSON files location
                               --make sure JSONs are in separate lines each

select deviceType, `day`, coalesce(conversionsRate ,cr) as cr_new, clicksCount 
  from json_table ;

推荐阅读