如何还原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
相关产品推荐
相关产品推荐

