从Databricks执行Snowflake时间旅行查询报错问题排查
核心差异:Snowflake与Databricks的时间旅行机制不兼容
你在Snowflake中可正常运行的查询:
SELECT * FROM Sample CHANGES(INFORMATION => DEFAULT) AT(TIMESTAMP => '2023-05-10 00:43:34.885 -7000')
在Databricks执行时触发错误:
Time travel data is not available for table Sample. The requested time is either beyond the allowed time travel period or before the object creation time.
以下是具体排查方向:
时间旅行支持范围不同
Snowflake的时间旅行保留期可通过DATA_RETENTION_TIME_IN_DAYS配置(默认1天,企业版最高90天),而Databricks仅Delta Lake表支持时间旅行,默认保留期为7天;普通Parquet/CSV表完全不支持时间旅行。先确认Databricks中Sample表的类型:- 执行
DESCRIBE EXTENDED Sample;查看dataRetentionDurationInDays字段,确认保留期是否覆盖目标时间戳 - 若为非Delta表,直接不支持时间旅行,必然报错。
- 执行
时间戳格式与时区解析差异
Snowflake支持-7000这类非标准时区格式,但Databricks仅兼容±HH:mm格式(如-07:00)。尝试将时间戳改为'2023-05-10 00:43:34.885 -07:00'后重试,避免时区解析偏差导致时间范围判断错误。表的创建时间不匹配
确认Databricks中Sample表的创建时间是否晚于指定的2023-05-10 00:43:34.885 -7000。如果该表是从Snowflake同步而来,且同步时间晚于目标时间戳,自然无法回溯到表创建前的时间点。语法规则不兼容
Snowflake的CHANGES是特有的变更数据捕获(CDC)语法,Databricks没有对应实现。Delta表的时间旅行需用TIMESTAMP AS OF语法,CDC功能需额外开启changeDataFeed后通过.changes()查询:-- 基础时间旅行查询 SELECT * FROM Sample TIMESTAMP AS OF '2023-05-10 00:43:34.885 -07:00' -- 开启CDC后的变更数据查询 SELECT * FROM Sample.changes('2023-05-10 00:43:34.885 -07:00', current_timestamp())
内容的提问来源于stack exchange,提问作者Adi

