如何处理Glue数据目录中的表结构变更和版本?

0

【以下的问题经过翻译处理】 假设数据源的Schema会随时间变化,你如何:

情况1. 运行Job/查询时指定一个Schema版本? 我想指定一个表的版本X,因为我知道我正在查询的数据是在版本X时创建的。 情况2. 跨版本查询数据?即,1月份的数据与2月份的数据具有略微不同的模式版本,我想在两者之间运行查询。

对于情况2,我已经进行了一些测试,发现添加或删除列不会产生问题。但是,如果列类型发生变化(即一个TIMESTAMP变成了一个STRING),则对不匹配目录的数据的查询会失败。我已经在Athena和Glue(DynamicFrame可以处理一些数据类型的不一致)中测试了这种行为。

我的想法是进行单独的查询,然后合并结果,但这需要回答情景1的问题...

profile picture
专家
已提问 6 个月前2 查看次数
1 回答
0

【以下的回答经过翻译处理】 版本本身在Athena中不可作为一个查询列使用。在Athena/Presto中,可以使用typeof函数来确定列的类型并选择如何处理。可以使用Case 函数。例如。

SELECT x, typeof(x)
from (select timestamp '2012-10-31 01:00 UTC' as x)
where typeof(x) like 'timestamp%'
UNION
SELECT date_parse(x,'%Y-%m-%d %h:%i:%s'), typeof(x)
from (select '2012-10-31 01:00:00' as x)
where typeof(x) like 'varchar%'

但理想情况下,即使在原始数据层中具有不同的Schema,也应该在ETL层中解析该Schema,以便在分析层中具有单个模式,可能有2个列 - 一个用于原始列,一个用于更改列。然后在服务层,如果需要将字符串列更改为时间戳,则轻松构建一个视图来合并列,例如:

SELECT coalesce(new_column, date_parse(old_column,'%m/%d/%Y %h:%i:%s %p')) as timestamp_column

profile picture
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则