【问题标题】:Google BigQuery: Importing DATETIME fields using Avro formatGoogle BigQuery:使用 Avro 格式导入 DATETIME 字段
【发布时间】:2020-08-05 13:55:20
【问题描述】:

我有一个从 Oracle 数据库下载数据并将其上传到 Google BigQuery 的脚本。这是通过写入 Avro 文件来完成的,然后使用 BQ 的 python 框架直接上传该文件。我将数据上传到的 BigQuery 表具有预定义的架构,其中一些包含 DATETIME 字段。

As BigQuery now has support for Avro Logical fields,时间戳数据的导入不再是问题。但是,我仍然无法导入日期时间字段。我尝试使用字符串,但随后出现以下错误:

Field CHANGED has incompatible types. Configured schema: datetime; Avro file: string.

我还尝试在导出时将字段数据转换为时间戳,但这会在 BigQuery 中产生内部错误:

An internal error occurred and the request could not be completed. Error: 3144498

甚至可以使用 Avro 导入日期时间字段吗?

【问题讨论】:

    标签: google-bigquery avro


    【解决方案1】:

    在 Avro 中,逻辑数据类型必须包含 attribute logicalType,此字段可能未包含在您的架构定义中。

    Here 有几个类似下面的例子。据我所知,类型可以是 int 或 long,但logicalType 应该是 date:

    {
    'name': 'DateField', 
    'type': 'int',
    'logicalType': 'date'
    }
    

    设置逻辑数据类型后,再试一次。文档确实表明它应该可以工作:

    Avro logical type --> date  
    Converted BigQuery data type --> DATE
    

    如果遇到错误,检查 avro 文件的架构会很有帮助,您可以使用此命令获取其详细信息:

    java -jaravro-tools-1.9.2.jargetschema my-avro-file.avro

    更新

    对于单独 DATE 不起作用的情况,请考虑 TIMESTAMP 可以使用来自 unix 纪元 1970 年 1 月 1 日 00:00:00.000000 UTC 的number of micro/nano seconds 存储日期和时间(UTC 似乎是默认值对于 avro)。此外,存储在 avro 文件(类型为 DATE o TIMESTAMP)中的值与特定时区无关,在这个意义上,它与 BigQuery Timestamp 数据类型非常相似。

    【讨论】:

    • 问题是日期逻辑类型不包含时间。这是有道理的,因为我应该能够使用时间戳。然而,我的问题是 BigQuery 时间戳完全是 UTC,我对将时间戳转换为另一个时区不感兴趣。
    • 你是对的,UTC 是 BigQuery 中的默认时区。由于这是一个单独的问题并且原始问题已得到解决(是否可以使用 Avro 导入日期时间字段?),您可能想要打开一个新线程或搜索现有建议,如 this post。我个人建议在 avro 文件中包含 UTC 日期和时间,以便 BQ 可以在 UTC 中存储您的正确时间。然后,在查询数据时,可以使用DATETIME(timestamp_expression [, timezone])等函数再次转换到原来的时区,或者其他。
    • 我明白了。所以我收集到我的问题的答案是不,不能使用 Avro 文件导入日期时间。无论如何谢谢:)
    • 谢谢你,只是想添加一个更新以帮助其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多