Google bigquery Avro日期和时间与BigQuery的兼容性?
BigQuery通常在加载Avro数据方面做得很好,但是“bq load”在使用Avro logicalType属性的时间戳和其他日期/时间字段方面有很多问题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(不兼容
还是“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加载——源格式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"
}
}
]
}