将大查询数据导出到云存储,整数字段更改为字符串格式,但浮点格式保持为数字格式

Posted

技术标签:

【中文标题】将大查询数据导出到云存储,整数字段更改为字符串格式,但浮点格式保持为数字格式【英文标题】:export bigquery data to cloud storage, the integer field changs to string format but float format stays as numeric format 【发布时间】:2017-04-24 20:54:43 【问题描述】:

我有这些大查询字段

views   INTEGER NULLABLE    
comments    INTEGER NULLABLE    
shares  INTEGER NULLABLE    
watch_time_minutes  FLOAT   NULLABLE    

查看 cmets 分享 watch_time_minutes 0 0 1 0.0

我通过 BigQuery 控制台页面(简称“导出表”)将这个 bigquery 数据导出到云存储(json 格式),我得到的是

"views":"0","comments":"0","shares":"1","watch_time_minutes":0

注意在这个 json 记录中,整数字段更改为字符串值, "views":"0","cmets":"0","shares":"1"

但浮点字段保持为数字格式 “watch_time_minutes”:0

Json 中的整数字段应保持为数字格式

"views":0,"comments":0,"shares":1

否则,在接下来的过程中,当我对这些应该是整数字段(但在 json 中没有显示为字符串)进行数学运算时,我会遇到问题。

有什么建议吗?

现在,我有一个解决方案是循环遍历(数百万行)存储文件并将所有整数字段转换回整数。但它击败了“只需一条语句将 bigquery 表导出到存储”的性能优势。

我有另一个丑陋的解决方案是“将整数字段重新定义为浮点数”,但这真的很丑陋,以后会导致其他问题。比如我无法将浏览次数显示为 0.0 次。等等

谢谢!

【问题讨论】:

【参考方案1】:

这已在问题跟踪器上报告了几次,例如Json exports on BQ is exported incorrectly。从关于该问题的最后评论:

原因是大多数 JSON 解析器只支持 32 位整数, 而 BQ 整数有 64 位。您可以使用字段类型 结果来确定如何解析 JSON,或者是否希望 JSON 使用数字而不是字符串,您可以在查询中转换列 到 FLOAT(旧版 SQL)或 FLOAT64(标准 SQL)。注意这个选项 但是,可能会失去精度。

或者,您可以使用支持 64 位整数的 Avro 格式。

【讨论】:

以上是关于将大查询数据导出到云存储,整数字段更改为字符串格式,但浮点格式保持为数字格式的主要内容,如果未能解决你的问题,请参考以下文章

导出为 JSON 时如何保留整数数据类型?

无法将数据类型更改为日期

如何将子文档中的字段更改为 Mongoose 中的父字段

数据从 SQL Developer 导出到 CSV

将列类型从整数更改为字符串

如何将时间跨度变量更改为整数类型?