Apache BeamSQL中LIKE运算符未实现,寻求字符串通配符查询替代方案
替代BeamSQL中LIKE操作符的实用方案
嘿,我刚好碰到过类似的问题!针对你在Apache Beam 2.4.0使用BeamSQL时遇到的LIKE is not implemented yet异常,这里有几个可行的替代思路:
1. 用REGEXP_MATCH函数模拟LIKE逻辑
BeamSQL原生支持正则匹配,完全可以用它来替代LIKE的通配符查询,对应关系很直观:
- 替代
column LIKE '%xxx%':写为REGEXP_MATCH(column, '.*xxx.*') - 替代
column LIKE 'xxx%':写为REGEXP_MATCH(column, '^xxx.*') - 替代
column LIKE '%xxx':写为REGEXP_MATCH(column, '.*xxx$') - 替代
column LIKE 'x_x'(单字符通配):写为REGEXP_MATCH(column, 'x.x')
举个实际的查询例子,比如要筛选名字里包含“Doe”的记录:
SELECT * FROM user_table WHERE REGEXP_MATCH(user_name, '.*Doe.*')
2. 自定义UDF实现类LIKE功能
如果正则表达式写起来觉得麻烦,你可以自己写一个UDF(用户自定义函数)来模拟原生LIKE的行为,然后在BeamSQL里注册使用。
简单的Java UDF示例:
public class CustomLikeUdf extends StandardScalarFunction<String, String, Boolean> { @Override public Boolean apply(String inputStr, String likePattern) { // 把LIKE的通配符转成正则规则:%替换成.*,_替换成. String regexPattern = likePattern.replace("%", ".*").replace("_", "."); return inputStr.matches(regexPattern); } }
注册并使用UDF:
// 初始化管道 PipelineOptions options = PipelineOptionsFactory.create(); Pipeline pipeline = Pipeline.create(options); // 注册自定义的LIKE函数,命名为MY_LIKE BeamSql.registerUdf("MY_LIKE", CustomLikeUdf.class, String.class, String.class, Boolean.class); // 执行包含自定义函数的查询 PCollection<Row> queryResult = pipeline.apply( BeamSql.query("SELECT * FROM user_table WHERE MY_LIKE(user_name, '%Doe%')") );
3. 升级Beam版本(最省心的方案)
其实BeamSQL的LIKE操作符在后续版本中已经被实现了,比如Beam 2.10.0及之后的版本都支持原生LIKE语法。如果你的项目没有强依赖2.4.0的特殊特性,直接升级到较新的稳定版本,就能直接用LIKE了,不用折腾替代方案。
内容的提问来源于stack exchange,提问作者Anna Kasikova
相关产品推荐
相关产品推荐

