hive模糊匹配两张表里的字符串,有比笛卡尔积更高效的方法吗?
已了解的知识是:
以前SQL server在on里写between...and...或like等不等式判断都是可以的。hive只支持等值连接,于是相当于不写连接词,让两张表笛卡尔积,再把不等值的判断写在where里。
为了跑笛卡尔积还需要设置一下nonstrict。
我遇到的场景是一张主表里有10w行产品数据。另有一张黑名单的表也有10w行黑名单。需检查每个产品名称,若包含任何一个黑名单字符串,就抓出来。基于我了解的知识写如下HQL:
set hive.mapred.mode = nonstrict;
select a.ProductName,b.Keyword
from 产品表 a
left outer join 待匹配字符串的清单表 b on 1=1
where instr(a.ProductName,b.Keyword) > 0
问题是这种跑法几个小时都跑不好,比SQL server慢多了。请问大神有什么更好的做法吗?
一种做法是自己写HDF函数,我写不来java,有大神写过类似的函数能分享一下吗?
还有一个思路,我找到HIVE 2.0多了这个函数:
in_file(string str, string filename)
Returns true if the string str appears as an entire line in filename..
如果文件名为filename的文件中有一行数据与字符串str匹配成功就返回true。
尝试过速度不错,不过它的“匹配”只是判两个字符串完全相等,不知道有没有更进一步的官方函数能做到模糊匹配。或者大神基于in_file()改进出模糊匹配的功能?