首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Avro日期和时间与BigQuery的兼容性?

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

Stack Overflow用户
提问于 2016-11-17 10:03:25
回答 4查看 7.6K关注 0票数 5

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

  1. 当BigQuery时间戳将其解释为微秒时间戳时,我使用Avro类型的时间戳-millis的数据就会出现故障。
  2. 可以加载到时间戳中的时间戳-micros整数在BigQuery日期时间中无效。我找不到解释什么在https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types是有效的
  3. ISO8601格式的字符串不能加载到时间戳或日期时间(不兼容类型错误),但我认为如果加载普通JSON,BigQuery会支持这一点。
  4. Avro " DATE“类型无法加载到日期(也是不兼容的类型)。

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

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

还是"bq加载“是问题所在?是否有更好的方法来加载Avro数据?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-18 18:29:54

对于Avro逻辑类型的本地理解现在对所有BigQuery用户都是公开的。有关详细信息,请参阅此处的文档页:类型

票数 3
EN

Stack Overflow用户

发布于 2017-06-19 18:28:01

更新:现在支持此特性,请跟随Google.com/35905894获取更多信息。

正如华所说,在BigQuery中不支持Avro逻辑类型,但是加载带有时间戳的Avro数据的支持方法是使用LONG Avro类型将数据加载到具有时间戳列的现有BigQuery表中。此外,该值应该是从历代起的微秒(而不是秒或毫秒)。例如,下面的Avro文件有一个值为1408452095000000的长字段,它将表示"2014-08-19 12:41:35“。

Avro文件的架构:

代码语言:javascript
复制
% avro-tools getschema ~/dataset/simple_timestamp.avro
{
  "type" : "record",
  "name" : "FullName",
  "fields" : [ {
    "name" : "t",
    "type" : "long"
  } ]
}

将Avro文件加载到带有时间戳字段的表的示例:

代码语言:javascript
复制
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 |
+---------------------+
票数 9
EN

Stack Overflow用户

发布于 2017-03-25 14:00:24

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

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

代码语言:javascript
复制
(object as java.sql.Timestamp).time * 1000

并把它放在我的阿夫罗记录中,输入Schema.Type.LONG

然后,我在用JSON为我的数据创建了一个架构文件中给出了“时间戳”的列类型。

[ {"name": "job", "type": "string", "mode": "required"}, ... {"name": "began", "type": "timestamp", "mode": "required"}, ... ]

(见开始的字段)

最后,我将它导入到BigQuery中

代码语言:javascript
复制
bq mk test.test2 dataset.avro schema.json

结果是

$ bq head test.test2 +------+----+----------+---------------------+---------+-----------+ | job | id | duration | began | status | node_name | +------+----+----------+---------------------+---------+-----------+ | 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不允许为Avro文件指定架构,但是CLI客户端和API会指定模式。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40651878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档