json - 使用 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 表映射上实现这样的结果?
解决方案
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 ;
推荐阅读
- function - Dart Flutter:功能未执行
- security - 我在安装 libc6 时遇到问题:amd64 会破坏语言环境,并且不允许取消配置
- javascript - 收到数据后渲染 MathJax
- ios - 如何快速获取窗口大小(包括 iPad 分屏)
- javascript - 如何使用角色反应和自动删除用户反应进行角色检查
- python - 为什么我收到此 django 连接中止错误
- amazon-web-services - Website does not update - Even after Invalidation through AWS Website, CLI and changing metadata of S3 Bucket
- selenium-webdriver - Selenium Java - Chrome 83. 0 - Authentication required. Basic Authentication required. Unable to login
- reactjs - Reactstrap - 如何在按钮内正确渲染微调器?
- php - is there any option print 0 if array position is null?