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

Avro日期和时间与BigQuery的兼容性?

白刚洁
2023-03-14

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

  1. 当BigQuery时间戳将Avro类型时间戳millis的数据解释为微秒时间戳(关闭1000)时,我的数据被破坏

我想我可以通过始终将数据加载到临时字段并使用CAST查询或将它们转换为其他字段来解决这些问题,但这并不能很好地扩展或支持模式演进或流。在Avro中使用定义明确的模式生成数据应该可以避免为不同的消费者再次转换数据的额外步骤。

BigQuery真的与Avro日期和时间不兼容吗?(还是我在做傻事)

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

共有3个答案

曾骁
2023-03-14

我在PostgreSQL表中拥有带有TIMESTAMP列的数据。在遵循https://github.com/spotify/spark-bigquery/issues/19.评论中的建议后,我能够通过Avro将其导入BigQuery

使用Kotlin中的PostgreSQL JDBC库,我将时间戳重新计算为BigQuery内部格式(自Unix时代开始以来的微秒数)

(object as java.sql.Timestamp).time * 1000

并将其放入我的avro记录中,键入Schema.type.LONG。

然后,我用JSON为我的数据创建了一个模式文件,其中我给出了“timestamp”列类型。

[{“name”:“job”,“type”:“string”,“mode”:“required”},{“name”:“start”,“type”:“timestamp”,“mode”:“required”},…]

(见开始字段)

最后,我用

bq mk test.test2 dataset.avro schema.json

结果是

<代码>$bq头部测试。测试2----------------------------------------作业| id |持续时间|开始|状态|节点|名称|---------------作业1 | 0.0 | 2012-04-01 00:00:00 | aStatus | aNodeName | |作业2 | 1 | 0.0 | 2020-02 00:02:02 |124; aStatus | aNodeName |------------

Web UI不允许为Avro文件指定模式,但CLI客户端和API允许。

我现在唯一的问题是处理时区问题。但这不是阿夫罗的问题。

冀萧迟
2023-03-14

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

晏鸿畅
2023-03-14

更新:现在支持此功能,请关注issuetracker.google。com/35905894获取更多信息。

正如华所说,BigQuery中不支持Avro逻辑类型,但支持的加载带有时间戳的Avro数据的方法是使用长Avro类型将数据加载到具有时间戳列的现有BigQuery表中。此外,该值应该是从EPOCH开始的微秒(而不是秒或毫秒)。例如,下面的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 |
+---------------------+
 类似资料:
  • 我在我的项目中使用Reactstrap,它目前只有两个单独的输入(日期和时间)。有没有人知道一个日期时间选择器与MongoDB的格式()兼容。Reactstrap没有一个,HTML的类型似乎不起作用

  • 日期与时间 避免使用 DateTime,除非你确实需要处理历法改革(儒略/格里历的改革),此时通过设置 start 参数来明确你的意图。 # 差 - 使用 DateTime 表示当前时间 DateTime.now # 好 - 使用 Time 表示当前时间 Time.now # 差 - 使用 DateTime 表示近现代日期 DateTime.iso8601('2016-06-29') # 好 -

  • 日期与时间 手动设定 可手动设定年/月/日/时/分/秒(12小时制的AM / PM)。 透过因特网设定 经由因特网自动取得日期、时间。 网络联机的详细说明,请参阅(网络设定) > [Infrastructure模式]。 提示 将(设定)>(主题设定) > [颜色]设定为[每月]时,将会于变更[日期与时间]的月份后,自动改变背景颜色。

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将

  • 让我一起学习一个新的内建对象:日期(Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 例如,我们可以使用它来存储创建/修改时间,或者用来测量时间,再或者仅用来打印当前时间。 创建 创建一个新的 Date 对象,只需要调用 new Date(),在调用时可以带有下面这些参数之一: new Date() 不带参数 —— 创建一个表示当前日期和时间的 Date 对象: let now =

  • 日期和时间 日期、时间、时间戳的值支持ISO 8601格式,格式还包含了时区: CALL TIMESTAMP '2008-01-01 12:00:00+01:00'; 如果未设置时区,将使用系统中当前的时区。日期和时间信息存储在 H2 数据库文件,不包含时区信息。如果数据库打开使用另一个系统时区,日期和时间将是相同的。这意味着如果你存储的值“2000-01-01 12:00:00”在一个时区,然