当前位置: 首页 > 知识库问答 >
问题:

BigQuery:加载日期列数据类型为long转换为时间戳的avro文件

寇坚成
2023-03-14

我很难让BigQuery正确地从avro文件加载时间戳。

avro文件的日期列存储为长,带有逻辑类型时间戳micros。根据文档,BigQuery应该将其存储为时间戳数据类型。我还尝试了逻辑类型的时间戳毫秒。

数据存储在avro中,如下所示:

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

tm和创建的字段分别为longs、2019-03-31T00:00:00Z和2020-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加载导入到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中提供的实际值相去甚远。

有人对如何正确地做到这一点有什么想法吗?

共有1个答案

谢奕
2023-03-14

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

{"name":"created","type":{"type":"long", "logicalType":"timestamp-millis"}}
 类似资料:
  • 本文向大家介绍Java将日期类型Date时间戳转换为MongoDB的时间类型数据,包括了Java将日期类型Date时间戳转换为MongoDB的时间类型数据的使用技巧和注意事项,需要的朋友参考一下 存了一个时间类型(Date)的数据到mongo数据库中,但是前台显示的是一串数字。继而引发了如下问题: Java里面如何把 时间戳 1477387464495 转换为 2016-10-25 17:24:2

  • 嗨,我有一个android应用程序,使用返回Int(或Long)类型的时间戳。我想将其转换为人类阅读器日期时间(根据设备时区) 例如,1175714200转换为GMT:2007年4月4日星期三19:16:40 GMT您的时区:2007年4月5日,3:16:40 AM GMT 8:00 我使用这个函数进行转换,但似乎没有返回正确的结果(所有结果都像(15/01/1970 04:04:25),这是不正

  • 我试图找出如何在Kotlin中将转换为,这在Java中非常简单,但我在Kotlin中找不到任何等效的。 例如:历元时间戳(1970-01-01以来的秒数)== 在Kotlin中是否有解决方案,或者我是否必须在Kotln中使用Java语法?请给我一个简单的例子来说明如何解决这个问题。提前谢谢。 这个链接不是我问题的答案

  • 问题内容: 我需要将格式为“ dd / mm / yyyy”的字符串转换为长型。为了将值传递给android中的calendarProvider。 目前我有: 我需要: 我已经尝试过使用SimpleDateFormat,但是在获取正确的类型时遇到了问题。任何帮助将非常感激。 问题答案: 您可以使用以下代码从字符串日期中以“ dd / mm / yyyy”格式获取长值(自格林尼治标准时间1970年1

  • 问题内容: 我尝试将其转换为java.sql.Timestamp后插入,并使用以下代码段: 但是,这是给我的 有没有办法在没有毫秒的情况下获得输出? 问题答案: 您可以使用来减少毫秒数: 输出:

  • 问题内容: 我有以下整数形式的时间戳 我可以使用SQL进行转换: 如何在Java中转换它?这样它将返回值: 问题答案: 假设自1970年1月1日以来的时间(以秒为单位)。你可以试试