如何使用“bq load”在 BigQuery 中存储超过 9 个高精度小数?

Posted

技术标签:

【中文标题】如何使用“bq load”在 BigQuery 中存储超过 9 个高精度小数?【英文标题】:How to store more than 9 high-precision decimals in BigQuery with `bq load`? 【发布时间】:2021-11-05 02:53:43 【问题描述】:

我正在尝试将 bq load 以换行符分隔的 geojson 文件放入 BigQuery。它工作正常(即使geometry 值工作正常!)除非尝试使用超过 9 位小数的高精度数字。根据文档,"ShapeSTArea": 20263.3349609375 等键:值不会存储为 NUMERIC,但也不会存储为 STRING

在我的架构中,首先我尝试了 NUMERIC 类型,但我得到了

- query: Invalid NUMERIC value: 20263.3349609375 Field: ShapeSTArea;
Value: 20263.3349609375

这让我很困惑,但后来我记得NUMERIC 不能代表超过 9 位小数。而且我不能使用低精度的FLOAT64,原因很明显。然后我将架构类型更改为STRING 并得到了

- Error while reading data, error message: JSON parsing error in row
starting at position 0: Could not convert value to string. Field:
ShapeSTArea; Value: 20263.3349609375

所以我有两个问题:

    为什么不能将像 20263.3349609375 这样的值存储为 STRING? 我应该如何使用 bq load 将这些高精度数字存储在 bigquery 中(不使用数据流或其他脚本)?

【问题讨论】:

【参考方案1】:

请将有关将浮点 JSON 值存储到 STRING 表列中的问题报告给 BigQuery - https://cloud.google.com/support/docs/issue-trackers。我认为这应该可行。

您应该能够将此值存储在FLOAT64 中而不会丢失数据,FLOAT64 具有足够的精度来存储 15 位十进制数字。 JSON 浮点值通常为 64 位。

或者,您可以使用比 Numeric 精度更高的 BigNumeric 类型:https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types

【讨论】:

以上是关于如何使用“bq load”在 BigQuery 中存储超过 9 个高精度小数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 bq load 加载带有 NULL 列的 CSV

在 Windows 上使用 bq load 和 python 子进程分隔的加载管道

如何使用 Bigquery 在 Google Bigquery 中进行身份验证,而无需使用服务帐户进行用户输入

如何使用标准 SQL 在 BigQuery 中透视表?

如何在 Datalab 的 api 中使用 Bigquery 中的子查询?

如何使用 API 在 BigQuery 中获取临时表的名称