我尝试编写Spark SQL查询以从参考表中获取一组值,并使用它们来过滤主表中的行。
当前SQL看起来像:
select time, code, user, message from TABLE where
(code = 'x' and (user like '%USER1%' or user like '%USER2%') and not (message like '%PREFIX1:HOST1%' or message like '%PREFIX1:HOST2%')) or
(code = 'y' and (user like '%USER1%' or user like '%USER2%') and not (message like '%PREFIX2:HOST1%' or message like '%PREFIX2:HOST2%'))
我应该能够将上述内容更改为:
select time, code, user, message from TABLE where
(code = 'x' and user rlike '(USER1|USER2)' and not message rlike 'PREFIX1:(HOST1|HOST2)') or
(code = 'y' and user rlike '(USER1|USER2)' and not message rlike 'PREFIX2:(HOST1|HOST2)')
但理想情况下我希望能够使用外部表来防止必须多次将用户/主机加载到sql中并且可能达到sql周围的最大长度限制(用户设置很小,主机集合由几百个主机组成,可以更新),如:
Table USERS { username: String }
Table HOSTS { hostname: String }
select time, code, user, message from TABLE where
(code = 'x' and user rlike '<ANY username FROM USERS>' and not message rlike 'PREFIX1:<ANY hostname FROM HOSTS>') or
(code = 'y' and user rlike '<ANY username FROM USERS>' and not message rlike 'PREFIX2:<ANY hostname FROM HOSTS>')
我认为上面的完全匹配实现起来很简单,但因为匹配似乎有点困难。
我怀疑我应该能够使用数据框来处理某些工作但是我可能会因为不同的语法而有类似的限制。例如。过滤器看起来像:
df.filter($"message".rlike("PREFIX1:(HOST1|HOST2|HOST3)")
另一个选择是在我达到这一点之前运行更好的解析逻辑,这样我就可以进行精确匹配,这可以更容易解决,但也使得在客户可以使用的DSL中表示更加困难。理想情况下,我希望能够在一个字段中表示匹配其中一个值。