You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何还原BigQuery中双整数存储的MongoDB Decimal原始数值?

还原MongoDB Decimal128至BigQuery数值

你可以通过BigQuery的JavaScript UDF(用户定义函数)来解析DataFlow导入的high和low字段,还原出原始的Decimal值。以下是具体实现:

步骤1:创建临时UDF

CREATE TEMP FUNCTION decode_decimal128(high INT64, low INT64)
RETURNS NUMERIC
LANGUAGE js AS r"""
const highBig = BigInt(high);
const lowBig = BigInt(low);
// 组合两个64位整数为完整的128位Decimal128表示
const combined = (highBig << 64n) | lowBig;
// 提取符号位:1表示负数,0表示正数
const sign = (combined >> 127n) === 1n ? -1 : 1;
// 提取14位指数部分,减去IEEE 754-2008 Decimal128的偏置值6176
const exponentBits = (combined >> 113n) & 0x3FFFn;
const exponent = Number(exponentBits) - 6176;
// 提取113位系数部分
const coefficient = combined & ((1n << 113n) - 1n);
// 计算原始数值:符号 × 系数 × 10^指数
return sign * Number(coefficient) * Math.pow(10, exponent);
""";

步骤2:使用UDF还原数值

假设你的表名为your_table,嵌套字段为Value.Amount,可以这样查询:

SELECT
  decode_decimal128(Value.Amount.high, Value.Amount.low) AS original_amount
FROM your_table

原理说明

DataFlow导入MongoDB的Decimal128类型时,会将其序列化为驱动内部的两个64位整数(high和low),二者组合后是IEEE 754-2008标准的Decimal128完整二进制表示:

  • 最高1位是符号位
  • 接下来14位是带偏置的指数(偏置值为6176)
  • 最后113位是有效系数

借助JavaScript的BigInt类型可完整处理128位整数,解析出符号、指数和系数后即可计算出原始十进制数值。

内容的提问来源于stack exchange,提问作者Mateusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:58:08