其他分享
首页 > 其他分享> > 两表模糊匹配某字段做关联

两表模糊匹配某字段做关联

作者:互联网

前言:遇到需要用码表对百万级的明细表打标的情况,而明细表与码表中只有某个字段具有模糊匹配的关系。

具体场景:码表中的某个码值字段与明细表中的某一字段呈包含关系,现在需要通过这两个字段的模糊匹配做两表关联,给明细表打上码表中的另一字段。

大致思路是两表笛卡尔积后用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