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

DuckDB-WASM返回UTF-8类型的Scalar UDF异常返回求助

解决DuckDB-WASM自定义UDF返回空字符(�)的问题

问题分析

你遇到的问题根源在于DuckDB-WASM的自定义标量函数对字符串类型的处理要求:直接返回JavaScript字符串会触发类型序列化错误,最终导致输出空字符(�),必须严格遵循Arrow数据类型规范处理输入和返回值。

解决方案

修正UDF的参数提取逻辑,并返回Arrow Utf8Scalar实例,而非原始JS字符串:

修正后的UDF代码

import { Utf8, Utf8Scalar } from 'apache-arrow';

// 修正后的字符串处理UDF
function stringTest(a) {
  try {
    // 从Arrow Scalar实例中提取原始字符串内容
    const inputStr = a.value;
    // 返回符合Arrow规范的Utf8Scalar实例
    return new Utf8Scalar(inputStr + "hello");
  } catch(ex) {
    console.error(ex);
    // 异常场景返回空字符串的Scalar实例
    return new Utf8Scalar("");
  }
}

// 注册UDF
await conn.createScalarFunction('stringTest', new Utf8, stringTest);

正确调用UDF的查询示例

确保在SQL查询中显式调用自定义函数:

const result = await conn.query(`SELECT stringTest(your_target_column) FROM '${tableName}'`);
const rows = result.toArray();

// 打印处理后的结果
rows.forEach(row => {
  console.log(row.string_test); // 列名为函数名小写加下划线格式
});

关键注意事项

  • 输入参数处理:DuckDB-WASM会将字符串参数包装为Utf8Scalar实例,必须通过.value属性获取原始字符串内容,不能直接使用参数本身。
  • 返回值类型约束:必须返回对应Arrow类型的Scalar实例(如Utf8Scalar),直接返回JS原始字符串会导致序列化失败,产生空字符。
  • 版本兼容性:此方案完全适配你使用的DuckDB-WASM 1.28.1-dev294.0和Apache Arrow 17.0.0版本组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:51:08