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

如何在Druid中添加自定义JavaScript转换函数并用于SQL查询?

在Druid中集成自定义JavaScript函数并在SQL查询中调用

一、先修复你的函数语法问题

你的transformData有两处小错误:return 'xyz;缺了闭合单引号,还有最后一行return '';永远不会执行(前面已经有return分支)。修正后的版本:

function transformData(data) {
    const res = {};
    const dataArray = data.split(',');

    dataArray.forEach(value => { // 用forEach比map更合适,这里不需要返回新数组
        res[value] = true;
    });

    return 'abc' in res ? 'abc' : 'xyz';
}

二、在Druid中实现需求的两种方案

1. 启用JavaScript扩展注册自定义函数

Druid支持通过druid-javascript扩展添加自定义JS函数,先确认集群已启用该扩展:

  • 打开Druid的common.runtime.properties配置文件,检查是否有druid.extensions.loadList=["druid-javascript"],没有的话添加进去,然后重启Druid服务。

临时注册(仅当前查询生效)

在SQL查询的上下文参数里直接定义函数,不用修改全局配置:

SELECT 
  TRANSFORM_DATA(your_target_column) AS transformed_result
FROM your_datasource
WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '1' DAY
CONTEXT {
  "javascript": {
    "functions": {
      "TRANSFORM_DATA": "function(data) { const res = {}; data.split(',').forEach(v => res[v] = true); return 'abc' in res ? 'abc' : 'xyz'; }"
    }
  }
}

全局注册(所有查询可用)

如果需要所有查询都能调用这个函数,在common.runtime.properties里添加:

druid.javascript.globalFunctions=TRANSFORM_DATA:function(data) { const res = {}; data.split(',').forEach(v => res[v] = true); return 'abc' in res ? 'abc' : 'xyz'; }

保存后重启Druid,之后直接在SQL里写TRANSFORM_DATA(your_column)就行。

2. 用Druid原生SQL表达式替代(无需扩展)

如果不想启用JavaScript扩展,直接用Druid支持的SQL函数就能实现完全相同的逻辑,性能还更好:

SELECT
  CASE
    WHEN ARRAY_CONTAINS(SPLIT(your_target_column, ','), 'abc') THEN 'abc'
    ELSE 'xyz'
  END AS transformed_result
FROM your_datasource
WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '1' DAY

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:39:52