Avro日期和时间与BigQuery兼容吗?

Kev*_*vin 4 avro google-bigquery

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

  1. 当BigQuery TIMESTAMP将它们解释为微秒时间戳(减1000)时,我的Avro类型timestamp-millis数据将被破坏。
  2. 可以加载到TIMESTAMP中的timestamp-micros整数在BigQuery DATETIME中变为INVALID。我在https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types找不到有效的解释
  3. 无法将ISO8601格式的字符串加载到TIMESTAMP或DATETIME(不兼容类型错误)中,但是我认为,如果我加载纯JSON,BigQuery会支持。
  4. Avro“日期”类型无法加载到DATE中(也是不兼容的类型)。

我想我可以通过始终将数据加载到临时字段中并使用对CAST的查询或将其转换为其他字段来解决这些问题,但这无法扩展或不支持模式演化或很好地进行流传输。使用具有明确定义的架构的Avro生产数据应该避免了为不同的使用者再次转换数据的额外步骤。

BigQuery真的与Avro日期和时间不兼容吗?(或者我在做些愚蠢的事情)

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

Vic*_*ota 6

更新:现在支持此功能,请访问issuetracker.google.com/35905894了解更多信息。

正如Hua所说,BigQuery不支持Avro逻辑类型,但是使用时间戳加载Avro数据的受支持方式是使用LONG Avro类型将数据加载到具有TIMESTAMP列的现有BigQuery表中。另外,该值应为距EPOCH的微秒(而不是秒或毫秒)。例如,下面的Avro文件具有一个LONG字段,值1408452095000000,它将表示“ 2014-08-19 12:41:35”。

Avro文件的架构:

% avro-tools getschema ~/dataset/simple_timestamp.avro
{
  "type" : "record",
  "name" : "FullName",
  "fields" : [ {
    "name" : "t",
    "type" : "long"
  } ]
}
Run Code Online (Sandbox Code Playgroud)

将Avro文件加载到带有Timestamp字段的表中的示例:

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 |
+---------------------+
Run Code Online (Sandbox Code Playgroud)


Hua*_*ang 4

所有 BigQuery 用户现在都可以公开了解 Avro 逻辑类型的本机理解。请参阅此处的文档页面了解更多详细信息:https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-avro#ological_types