如何在Apache Druid中解析COMPLEX<serializablePairLongString>高效获取rhs值?
解决Apache Druid中COMPLEX类型的rhs值提取问题
由于COMPLEX<serializablePairLongString>属于自定义/摄入聚合生成的非标准复杂类型,Druid本身并没有内置类似JSON操作符的官方方法直接解析它。不过可以通过以下几种更高效的方案替代正则提取:
摄入阶段拆分字段
如果可以修改数据摄入规范,建议在聚合生成这对数据时,直接将lhs(时间戳)和rhs(数值)拆分为两个独立的物理列(比如命名为open_ts和open_val)。查询时直接读取对应列即可,从源头避免后续解析开销,这是最省心的方案。自定义Scalar函数解析
利用Druid的扩展机制编写一个简单的自定义Scalar函数,直接操作该Pair对象获取rhs值:- 编写Java类实现
ScalarFunction接口,接收COMPLEX类型参数,将其转换为对应的Pair实例后返回rhs字段值 - 将函数注册到Druid集群
- 查询时直接调用函数,示例:
SELECT get_pair_rhs(earliest("open")) as op FROM your_table
这种方式性能最优,完全避免字符串解析的开销。
- 编写Java类实现
优化正则表达式(退而求其次)
如果暂时无法修改摄入流程或添加自定义函数,可以优化现有正则表达式去掉lookbehind,提升匹配效率:SELECT REGEXP_EXTRACT(earliest("open"), 'rhs=([\\d.]+)') as op FROM your_table
内容的提问来源于stack exchange,提问作者groo
相关产品推荐
相关产品推荐

