BigQuery:加载具有日期列数据类型的 avro 文件,只要转换为时间戳

Posted

技术标签:

【中文标题】BigQuery:加载具有日期列数据类型的 avro 文件,只要转换为时间戳【英文标题】:BigQuery: Load avro-files with date column data type as long converted to timestamp 【发布时间】:2020-08-10 12:50:34 【问题描述】:

我无法让 BigQuery 从 avro 文件中正确加载时间戳

avro 文件的日期列存储时间很长,逻辑类型为 timestamp-micros。根据文档,BigQuery 应将其存储为时间戳数据类型。我也尝试过 timestamp-millis 的逻辑类型。

数据是这样存储在avro中的:

'id': '<masked>', '<masked>': '<masked>', 'tm': 1553990400000, '<masked>': <masked>, '<masked>': <masked>, 'created': 1597056958864

字段 tmcreated 是 long,2019-03-31T00:00:00Z2020-08-10T11 :50:58.986816592Z 分别。

avro 的架构是

"type":"record","name":"SomeMessage","namespace":"com.df",
"fields":
["name":"id","type":"string",
"name":"<masked>","type":"string",
"name":"tm","type":"long","logicalType":"timestamp-micros",
"name":"<masked>","type":"int",
"name":"<masked>","type":"float",
"name":"created","type":"long","logicalType":"timestamp-micros"]";

当通过 bq load 导入 BigQuery 时,记录最终如下:

<masked>   <masked>   tm                            <masked>   <masked>  created
________________________________________________________________________________________________________
<masked> | <masked> | 1970-01-18 23:39:50.400 UTC | <masked> | <masked> | 1970-01-19 11:37:36.958864 UTC
________________________________________________________________________________________________________

使用的导入命令是:

bq load --source_format=AVRO --use_avro_logical_types some_dataset.some_table "gs://some-bucket/some.avro"

BigQuery 中的时间戳与 avro 中提供的实际值相差甚远。

有人对如何正确执行此操作有任何想法吗?

【问题讨论】:

似乎数据 1553990400000 和 1597056958864 以毫秒为单位。尝试通过微秒或在架构中使用 timestamp-millis 而不是 timestamp-micros 逻辑属性默认被忽略,出于向后兼容性的原因,因为最初不支持逻辑类型,cloud.google.com/bigquery/docs/…。你启用 useAvroLogicalTypes 了吗? 我确实启用了 useAvroLogicalTypes。我更新了我的问题以反映这一点。 @Ambrish,使用timestamp-millis 产生与timestamp-micros 相同的结果。几乎就像 BigQuery 没有看到逻辑类型信息一样。 【参考方案1】:

我发现 avro 架构实际上是错误的。 时间戳字段应该是这样的:

"name":"created","type":"type":"long", "logicalType":"timestamp-millis"

【讨论】:

以上是关于BigQuery:加载具有日期列数据类型的 avro 文件,只要转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

通过 CLI 将存储桶中的 AVRO 加载到具有日期分区的 BigQuery 中

列中的 BigQuery 日期分区

如何将 AVRO 文件中的整数值加载到 bigquery 中的日期列?

列类型 TIMESTAMP 的 BigQuery 导入转换日期时间偏移量/时区,但列类型 DATETIME 失败并显示“无效的日期时间字符串”

如何将 Avro 文件加载到具有“时间戳”类型的列的 BigQuery 表中

BigQuery 加载作业在 JSON 中的布尔数据类型字段上失败