2017-08-16 40 views
1

如何通过传递表名模式来排除Nifi的CaptureChangeMySQL处理器中的某些表(名称)?Regex表名模式以排除CaptureChangeMySQL中的某些表


例如,我有500个表格和他们对应的历史表格。 捕获更改应适用于员工,订单等,但不适用于其对应表EmployeeHistory,OrderHistory等。 简而言之,带有'历史'后缀的表应该由处理器过滤。


我试图

1)$ .table_name:等于( 'DeviceHistory'):不是() - 没有工作

2)$ {表名:等于( '*史'):不()} - 没有工作或者

回答

2

NiFi CaptureChangeMySQL processor documentation,该表名称模式字段设置为:

用于匹配影响匹配表的CDC事件的正则表达式(正则表达式)。正则表达式必须与存储在数据库中的表名匹配。如果该属性未设置,则不会根据表名称筛选事件。

这应该是Java regex string。纵观NiFi CaptureChangeMySQL processor source code,这里是这个值是如何使用的代码片段:

// Should we skip this table? Yes if we've specified a DB or table name pattern and they don't match 
skipTable = (databaseNamePattern != null && !databaseNamePattern.matcher(data.getDatabase()).matches()) 
     || (tableNamePattern != null && !tableNamePattern.matcher(data.getTable()).matches()); 

其中tableNamePattern持有Pattern.compile(YOUR_TABLE_NAME_PATTERN)

我写了在此基础上的一个示例程序,并得到使用此正则表达式的字符串所需的行为:

^(?:(?!History).)*$ 

这里是一个演示:https://regex101.com/r/VWuSTy/1/tests

+0

感谢Kevdoran,它仍包括历史记录表。我已经尝试过你在这里说的话。你认为我可以尝试别的吗? – Hem

+0

@Hem它看起来像负向预测并不像我们希望的那样,当它放置在一个贪婪的操作符(如“+”)后面时,它的工作方式不太合适。我用一些应该起作用的东西更新了我的答案。你可以试试吗? – kevdoran

+0

再次感谢! Kevdoran。不知道为什么即使在使用您共享的新正则表达式之后,处理器仍然无法按预期工作。我确实了解你采取的逻辑和方法,它应该起作用。无论如何,我感谢你的努力和帮助。 – Hem