Google bigquery Avro日期和时间与BigQuery的兼容性?

Google bigquery Avro日期和时间与BigQuery的兼容性?,google-bigquery,avro,Google Bigquery,Avro,BigQuery通常在加载Avro数据方面做得很好,但是“bq load”在使用Avro logicalType属性的时间戳和其他日期/时间字段方面有很多问题 当BigQuery时间戳将我的数据解释为微秒时间戳时,我的Avro类型时间戳为毫秒的数据被破坏(关闭1000) 可以加载到timestamp中的timestamp micros整数在BigQuery DATETIME中无效。我找不到一个解释,说明什么是有效的 ISO8601格式的字符串无法加载到TIMESTAMP或DATETIME(不兼容

BigQuery通常在加载Avro数据方面做得很好,但是“bq load”在使用Avro logicalType属性的时间戳和其他日期/时间字段方面有很多问题

  • 当BigQuery时间戳将我的数据解释为微秒时间戳时,我的Avro类型时间戳为毫秒的数据被破坏(关闭1000)
  • 可以加载到timestamp中的timestamp micros整数在BigQuery DATETIME中无效。我找不到一个解释,说明什么是有效的
  • ISO8601格式的字符串无法加载到TIMESTAMP或DATETIME(不兼容类型错误),但我认为如果加载纯JSON,BigQuery将支持这一点
  • Avro“日期”类型无法加载到日期(也是不兼容的类型)
  • 我想我可以通过总是将数据加载到临时字段并使用查询将其转换或转换到其他字段来解决这些问题,但这不能很好地扩展或支持模式演化或流。在Avro中使用定义良好的模式生成数据应该可以避免为不同的使用者再次转换数据的额外步骤

    BigQuery真的与Avro日期和时间不兼容吗?(还是我在做傻事)


    还是“bq负载”是这里的问题?是否有更好的方法加载Avro数据?

    所有BigQuery用户现在都可以公开了解Avro逻辑类型。有关更多详细信息,请参阅此处的文档页:

    我在PostgreSQL表中有一个带有时间戳列的数据。我能够通过Avro将它导入到BigQuery中,这是我在评论中给出的建议

    使用Kotlin中的PostgreSQL JDBC库,我重新计算了时间戳(从Unix时代开始算起的微秒)

    并将其放入我的avro记录中,键入
    Schema.type.LONG

    然后我给出了列类型“timestamp”

    
    [
    {“名称”:“作业”、“类型”:“字符串”、“模式”:“必需”},
    ...
    {“名称”:“开始”,“类型”:“时间戳”,“模式”:“必需”},
    ...
    ]
    

    (请参见开始字段)

    最后,我用

    bq mk test.test2 dataset.avro schema.json
    
    结果是

    
    $bq头部测试。测试2
    +------+----+----------+---------------------+---------+-----------+
    |作业| id |持续时间|开始|状态|节点|名称|
    +------+----+----------+---------------------+---------+-----------+
    |job1 | 1 | 0.0 | 2012-04-01 00:00:00 | aStatus | aNodeName|
    |job2 | 1 | 0.0 | 2020-02-02 00:02:02 | aStatus | aNodeName|
    +------+----+----------+---------------------+---------+-----------+
    

    Web UI不允许为Avro文件指定架构,但CLI客户端和API允许


    我唯一的问题是处理时区问题。但这并不是Avro的问题。

    更新:现在支持此功能,请遵循了解更多信息

    正如Hua所说,BigQuery中不支持Avro逻辑类型,但支持的加载带有时间戳的Avro数据的方法是使用长Avro类型将数据加载到具有时间戳列的现有BigQuery表中。此外,该值应该是从历元开始的微秒(而不是秒或毫秒)。例如,下面的Avro文件有一个长字段,值为140845209500000,表示“2014-08-19 12:41:35”

    Avro文件的架构:

    % avro-tools getschema ~/dataset/simple_timestamp.avro
    {
      "type" : "record",
      "name" : "FullName",
      "fields" : [ {
        "name" : "t",
        "type" : "long"
      } ]
    }
    
    将Avro文件加载到带有时间戳字段的表的示例:

    bq mk --schema t:TIMESTAMP -t vimota.simple_timestamp
    bq load --source_format=AVRO vimota.simple_timestamp ~/dataset/simple_timestamp.avro
    bq head vimota.simple_timestamp:
    
    +---------------------+
    |          t          |
    +---------------------+
    | 2014-08-19 12:41:35 |
    +---------------------+
    

    我们遇到了同样的问题,并且解决了。用于将日期数据导入日期类型的现有BQ表字段的Avro模式如下所示。日期值的整数值必须是自历元起的天数(不是秒)。请注意使用嵌套格式的架构类型定义的样式

  • 我创建了一个BQ表,其中一个字段名为“day”,类型为DATE,mode=REQUIRED
  • 我用下面的模式创建了一个Avro文件,其中有一条记录包含数天的整数值18639
  • 我把那个Avro文件上传到地面军事系统的一个桶里
  • 我使用以下命令将Avro数据加载到表中,并在表中查看时将其转换为BQ日期类型:
  • bq加载——源格式AVRO——使用逻辑类型s1.AVRO\u date gs://bucket\u name/bq\u date\u int\u logical\u nested.AVRO

    echo“从s1.avro_日期选择*”bq查询

    Waiting on bqjob_r1433d5cfa5eb9a89_00000176f3182f03_1 ... (0s) Current status: DONE   
    +------------+
    |    day     |
    +------------+
    | 2021-01-12 |
    +------------+
    
    使用的架构:

    {
      "type" : "record",
      "name" : "bq_date",
      "namespace" : "my.namespace",
      "fields" : [{
          "name" : "day",
          "type" : {
            "type" : "int",
            "logicalType" : "date"
          }
        } 
      ]
    }
    

    FWIW:我们测试了使用Avro Python 1.10.1和Java库创建的测试文件。

    有一个示例文件可以帮助调试这个问题(如果是bug,请在这里发布)。我不知道是bug还是BigQuery不支持将Avro数据加载到时间戳、日期时间和日期数据类型中。没有提到这三种类型中的任何一种。我不确定如何在此处附加二进制Avro数据文件..现在支持此功能,有关详细信息,请访问issuetracker.google.com/35905894。更新:BigQuery中现在支持逻辑类型。请参考下面的胜利者答案。您知道如何将avro数据(日期)加载到具有
    date
    类型的BigQuery吗?我尝试使用avro字符串,但失败了。e、 g.2018-11-29@Sugimiyantosuma您可以使用Avro的日期逻辑类型()吗?如果您被列入白名单或使用useAvroLogicalTypes标志,则BigQuery现在本机支持此功能:。
    {
      "type" : "record",
      "name" : "bq_date",
      "namespace" : "my.namespace",
      "fields" : [{
          "name" : "day",
          "type" : {
            "type" : "int",
            "logicalType" : "date"
          }
        } 
      ]
    }