如何用Logstash处理MySQL数据,将两个数组合并为对象数组?
Logstash合并数组为指定结构的解决方案
问题背景
数据源是MySQL导出的逗号分隔字符串字段,格式如下:
| field01 | field02 |
|---|---|
| q01, q02, q03 | 2, 3, 4 |
| q01, q03 | 2, 4 |
| q01, q03, q04, q05 | 2, 4, 5, 6 |
需要通过Logstash过滤器将两个字段拆分后的数组合并为如下结构:
data : [ { field01 : "q01", field02 : "2" }, { field01 : "q02", field02 : "3" }, ... ]
解决方案
仅靠mutate插件的add_field无法实现该需求,因为mutate不支持遍历数组元素并构建嵌套结构的操作。需要配合ruby过滤器完成数组的配对与重组:
完整过滤器配置
filter { mutate { # 用逗号+空格作为分隔符,避免数组元素带前置空格 split => { "field01" => ", " } split => { "field02" => ", " } } ruby { code => ' # 获取拆分后的两个数组 field01_array = event.get("field01") field02_array = event.get("field02") data_array = [] # 取两个数组的最小长度循环,避免数组长度不一致时出错 [field01_array.length, field02_array.length].min.times do |i| # 构建单个键值对哈希 item = { "field01" => field01_array[i], "field02" => field02_array[i] } data_array << item end # 将组装好的数组设置到data字段 event.set("data", data_array) # 可选:删除原始的field01和field02字段,减少输出冗余 event.remove("field01") event.remove("field02") ' } }
配置说明
mutate阶段:将field01和field02按,分割为数组,确保元素没有多余的前置空格。ruby阶段:- 获取拆分后的两个数组引用;
- 遍历数组索引,将对应位置的元素配对成哈希对象;
- 将所有哈希对象存入数组,最终设置到
data字段; - 可选删除原始字段,精简输出内容。
注意事项
如果两个数组的长度不一致,上述代码会以较短的数组长度为准,忽略超出长度的元素。若需要处理长度不一致的场景,可根据需求修改Ruby代码逻辑(比如为缺失元素填充默认值)。
内容的提问来源于stack exchange,提问作者vane
相关产品推荐
相关产品推荐

