两表模糊匹配某字段做关联
作者:互联网
前言:遇到需要用码表对百万级的明细表打标的情况,而明细表与码表中只有某个字段具有模糊匹配的关系。
具体场景:码表中的某个码值字段与明细表中的某一字段呈包含关系,现在需要通过这两个字段的模糊匹配做两表关联,给明细表打上码表中的另一字段。
大致思路是两表笛卡尔积后用INSTR做筛选来解决模糊匹配的问题,从而生成新的码表,最后就可以通过新的码表给明细表打标了。
数据量大的可以考虑给表加上分区字段分区处理,我这边使用的是ODPS,因此没有做手工的分区处理。
示例:
明细表:TB1;码表:TB2
现在需要通过TB1和TB2的URL字段做模糊匹配,从而给明细表打上码表中匹配到的ID字段。
本示例适用的字段模糊关系是包含关系,如TB1.URL='abcdefg',TB2.URL='abc',即明细表中的URL字段里,包含着码表URL字段里的唯一一个值。
由于数据量比较大,因此先把明细表中的URL字段去重和取出,做成临时表TMP1:
CREATE TABLE IF NOT EXISTS TMP1 AS
SELECT DISTINCT URL AS URL, 1 AS KEY FROM TB1;
同样,取出码表中需要模糊匹配和打标的字段,做成临时表TMP2(码表中的URL是唯一的,因此不需要去重)
CREATE TABLE IF NOT EXISTS TMP2 AS
SELECT ID AS ID,URL AS URL, 1 AS KEY FROM TB2;
最后通过笛卡尔积和INSTR函数,就能获得两表字段模糊关联上之后的结果表,最后通过最长匹配的原则去重后就生成新的码表了。
CREATE TABLE IF NOT EXISTS TMP3 AS
SELECT TB.ID,TB.URL1
FROM(
SELECT T3.ID AS ID ,T3.URL1 AS URL1 , T3.URL2 AS URL2
,ROW_NUMBER() OVER(PARTITION BY T3.URL1 ORDER BY LENGTH(T3.URL2) DESC) RN
FROM(
SELECT T2.ID AS ID,T1.URL AS URL1,T2.URL AS URL2
FROM TMP2 T2 JOIN TMP1 T1
ON T1.KEY=T2.KEY) T3
WHERE INSTR(T3.URL1,T3.URL2)>0)TB
WHERE TB.RN=1;
通过新的码表跟明细表做关联就能给明细表TB1打上ID字段了,这里省略了。
总结:记录一下,呱。
标签:匹配,某字,两表,URL,码表,T3,明细表,字段,ID 来源: https://blog.csdn.net/weixin_45261295/article/details/111303749