BigQuery 通常在加载 Avro 数据方面做得很好,但“bq load”在处理时间戳和使用 Avro 逻辑类型属性的其他日期/时间字段时遇到很多麻烦。
- 当 BigQuery TIMESTAMP 将 Avro 类型 timestamp-millis 的数据解释为微秒时间戳(相差 1000)时,我的数据会被破坏。
- 可加载到 TIMESTAMP 中的时间戳微整数在 BigQuery DATETIME 中变为无效。我找不到有效的解释https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types
- ISO8601 格式的字符串无法加载到 TIMESTAMP 或 DATETIME(不兼容类型错误),但我认为如果我加载纯 JSON,BigQuery 会支持这一点。
- Avro“日期”类型无法加载到 DATE(也是不兼容的类型)。
我想我可以通过始终将数据加载到临时字段并使用查询来 CAST 或将它们转换为其他字段来解决这些问题,但这不能很好地扩展或支持模式演变或流。在 Avro 中使用定义良好的模式生成数据应该可以避免为不同消费者再次转换数据的额外步骤。
BigQuery 真的与 Avro 日期和时间不兼容吗? (或者我在做一些愚蠢的事情)
或者“bq load”是这里的问题吗?有没有更好的方法来加载 Avro 数据?
更新:现已支持该功能,关注issuestracker.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"
} ]
}
将 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 |
+---------------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)