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

