Kafka transforms.Filter奇偶过滤失效及Couchbase源连接器过滤方案咨询
解决Couchbase源连接器过滤奇数key的问题(无需Confluent平台)
先明确你的疑问:JsonPath确实不支持%和&运算符
你尝试的%(取模)和&(位与)确实不在主流JsonPath实现的支持范围内,包括你参考的JsonPath库。JsonPath仅支持基础比较、逻辑运算以及有限的内置函数,这类运算不在标准支持列表里,所以之前的配置肯定无效。
无需Confluent平台的可行方案
方案1:用Couchbase N1QL提前过滤(最推荐)
直接在Couchbase源连接器里配置couchbase.query参数,用N1QL语句在数据源层面就过滤掉奇数key的文档,连接器只会拉取符合条件的数据:
couchbase.query=SELECT * FROM `你的桶名称` WHERE MOD(`key`, 2) = 0
Couchbase原生支持MOD()取模函数,这种方式效率最高,还绕开了JsonPath的限制。
方案2:自定义Kafka Connect转换类
如果必须在连接器层面处理,自己写个简单的转换类就行,不用依赖Confluent:
- 写一个Java类,实现
org.apache.kafka.connect.transforms.Transformation接口 - 在
apply方法里取出记录的key字段,判断是否为偶数,奇数直接返回null(就会被丢弃) - 把编译好的JAR放到连接器的
plugin.path目录,然后在连接器配置里加:
transforms=filterOddKey transforms.filterOddKey.type=你的包名.OddKeyFilterTransform
这种方式灵活性拉满,纯靠基础Kafka Connect环境就能实现。
方案3:试试Kafka Connect内置Filter转换(看环境兼容性)
部分Kafka Connect版本支持内置的Filter转换,结合EL表达式过滤:
transforms=filterOddKey transforms.filterOddKey.type=org.apache.kafka.connect.transforms.Filter transforms.filterOddKey.filter.condition=${value:key} % 2 == 0 transforms.filterOddKey.filter.type=include
注意:不是所有Kafka Connect发行版都支持EL的取模运算,得先测下你环境能不能用。
总结
优先选方案1,数据源端直接过滤性能最好、配置最简单;要是不能改查询语句,再考虑自定义转换的方式。
内容的提问来源于stack exchange,提问作者Sugs
相关产品推荐
相关产品推荐

