导出到 JSON 时如何保留整数数据类型?
How to preserve integer data type when exporting to JSON?
当我以 JSON 格式导出我的 bigquery tables 时,INTEGER
字段被转换为字符串。有没有办法在导出时保持整型数据类型?
重现整数->字符串转换现象的最少步骤如下:
- 运行查询
SELECT INTEGER(1) AS myInt
并将结果保存到table。请注意,输出 table 模式将类型显示为 INTEGER
.
- 以 JSON 格式导出 table。输出将是:
{"myInt":"1"}
在JSON格式中,"1"
is a string,不是整数。
这目前不可能;推理是因为 Javascript 规范、IEEE 浮点精度、JSON 和 BigQuery 整数大小的不幸组合。
在 Javascript 中,所有数字都必须可以表示为 IEEE754 双精度浮点值。 Javascript 将 JSON 个数字解析为 javascript 个数字。 BigQuery 使用 64 位有符号整数值。
问题来了,因为并不是所有的 64 位整数值都可以表示为 IEEE 754 双精度浮点值。 (很容易看出原因:IEEE 754 双精度浮点使用 64 位,但可以表示很多不是整数的东西;因此,必须有它不能表示的 64 位整数)。
因此,为了使 BigQuery JSON 响应在 Javascript 中工作,整数值用引号括起来,这样就不会丢失精度。
也就是说……在 API 请求中将整数表示为字符串的决定是有道理的,因为 API 的许多调用者将在 javascript 中。在导出数据时,似乎没有令人信服的论据不将整数表示为数字。 (除非现在更改它,否则将是一个重大更改)。
您可以在 BigQuery issue tracker 上提交错误来解决这个问题吗? (它可能会在导出配置中涉及另一个标志)。
当我以 JSON 格式导出我的 bigquery tables 时,INTEGER
字段被转换为字符串。有没有办法在导出时保持整型数据类型?
重现整数->字符串转换现象的最少步骤如下:
- 运行查询
SELECT INTEGER(1) AS myInt
并将结果保存到table。请注意,输出 table 模式将类型显示为INTEGER
. - 以 JSON 格式导出 table。输出将是:
{"myInt":"1"}
在JSON格式中,"1"
is a string,不是整数。
这目前不可能;推理是因为 Javascript 规范、IEEE 浮点精度、JSON 和 BigQuery 整数大小的不幸组合。
在 Javascript 中,所有数字都必须可以表示为 IEEE754 双精度浮点值。 Javascript 将 JSON 个数字解析为 javascript 个数字。 BigQuery 使用 64 位有符号整数值。
问题来了,因为并不是所有的 64 位整数值都可以表示为 IEEE 754 双精度浮点值。 (很容易看出原因:IEEE 754 双精度浮点使用 64 位,但可以表示很多不是整数的东西;因此,必须有它不能表示的 64 位整数)。
因此,为了使 BigQuery JSON 响应在 Javascript 中工作,整数值用引号括起来,这样就不会丢失精度。
也就是说……在 API 请求中将整数表示为字符串的决定是有道理的,因为 API 的许多调用者将在 javascript 中。在导出数据时,似乎没有令人信服的论据不将整数表示为数字。 (除非现在更改它,否则将是一个重大更改)。
您可以在 BigQuery issue tracker 上提交错误来解决这个问题吗? (它可能会在导出配置中涉及另一个标志)。