
在 duckdb-wasm 中读取含 decimal 类型的 Parquet 文件时,可通过 castDecimalToDouble: true 配置项,在 db.open() 时启用 decimal 到 double 的自动类型转换,避免手动 CAST 或查询报错。
在 duckdb-wasm 中读取含 decimal 类型的 parquet 文件时,可通过 `castdecimaltodouble: true` 配置项,在 `db.open()` 时启用 decimal 到 double 的自动类型转换,避免手动 cast 或查询报错。
duckdb-wasm 默认将 Parquet 中的 DECIMAL 类型映射为 DuckDB 内部的 DECIMAL 类型(保留精度),但某些前端场景(如图表渲染、数值计算)更依赖 JavaScript 原生 number(即 IEEE 754 double)。此时,启用 castDecimalToDouble 是最简洁、全局生效的解决方案。
该配置属于 DuckDBQueryConfig 的一部分,必须在调用 AsyncDuckDB.open() 时传入,不能在后续查询中动态设置。正确用法如下:
await db.open({
query: {
castDecimalToDouble: true,
// 可选:同时处理 bigint(如 Parquet 中的 INT64)
castBigIntToDouble: true
}
});
⚠️ 注意事项:
- 此配置仅影响 查询执行时的隐式类型转换行为,不改变底层数据存储格式;
- 启用后,所有 decimal 字段(无论精度/标度)均转为
DOUBLE,可能损失精度(例如DECIMAL(38,10)超出 double 精度范围时); - 若需部分字段保留 decimal,应显式使用
CAST(col AS DOUBLE)或col::DOUBLE进行按需转换; -
castDecimalToDouble与castBigIntToDouble互不影响,可独立启用。
完整初始化示例(含 bundle 加载与 worker 配置):
import * as duckdb from '@duckdb/duckdb-wasm';
export async function initDuckDB(): Promise<duckdb.asyncduckdb> {
const bundles = duckdb.getJsDelivrBundles();
const bundle = await duckdb.selectBundle(bundles);
const worker = new Worker(
URL.createObjectURL(
new Blob([`importScripts("${bundle.mainWorker}");`], { type: 'text/javascript' })
)
);
const logger = new duckdb.ConsoleLogger();
const db = new duckdb.AsyncDuckDB(logger, worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
// ✅ 关键:在此处传入 castDecimalToDouble 配置
await db.open({
query: { castDecimalToDouble: true }
});
return db;
}</duckdb.asyncduckdb>
初始化完成后,所有后续 SQL 查询(包括 SELECT * FROM parquet_scan('data.parquet'))中的 decimal 列将自动以 DOUBLE 类型返回,JavaScript 中可直接参与数学运算或传入可视化库,无需额外类型适配。










