目的
我使用 KingswaySoft SSIS 插件工具“Premium Lookup”,但我猜内置的 SSIS“Lookup”工具可能会出现同样的问题。
我尝试匹配双列对“first_name1”和“name1”以及“first_name2”和“name2”,并且边 1 和边 2 有时都有 NULL 值。
如果查找列之一为 NULL,则整行将传递到“不匹配”输出。Premium Lookup 工具在 DFT 中如下所示:输入被传递到 32 个不匹配的行,因为两侧之一具有 NULL 值,或者因为某些其他匹配列中存在 NULL 值:
我的目标是在其中一列中发现 NULL 时继续匹配列,以便查找继续并尝试匹配其他列,而 NULL 匹配应该是:
- 0% 匹配
- 或 NULL 并且根本不考虑平均分。
两者都很好,因为我还有一些经常匹配得足够好的专栏。
我要求最多 5 个匹配项,并且我会从输出中删除与主输入具有相同 ID 的任何匹配项,因为我只想查找双条目。因此,对于主数据中可能有重复的任何条目,最多应显示 5 个“下一个邻居”:
例如,如果双方都不知道名字,甚至在主输入字段中也不知道,我仍然希望从其他列(例如“生日”或“性别”)中获得匹配项。
到目前为止我已经尝试过的
我已经尝试用空字符串替换所有 NULL 值,以避免出现 NULL。然而,即使模糊查找也必须至少匹配 1%,如果您尝试将某些内容与空字符串匹配,则无法达到 1%,因为那是 0%。
传奇:
- 德语/英语:Vorname = 名字、Nachname = 姓名、Geburtsdatum = 生日、Geschlecht = 性别
- 查找:第 1 面:[1],第 2 面:[2]
- 主侧:[0] (我想将两个查找列与相同的主列匹配两次,以便将 Nachname_Vergleich 列复制到第二个 Nachname_Vergleich2 列2,并对 Vorname 列执行相同的操作)
复选框“将空字符串视为 NULL”会使高级查找在任何输入处崩溃
我还尝试通过''
工具本身再次将这些空字符串设置为 NULL 来解决这个问题,但是该设置会导致任何输入的查找崩溃,无论是否为 NULL,也在其他一些任务中进行了测试。因此,存在错误或者我不理解该设置,但我握住了该复选框:
高级比较设置 - v22.1 (22.1.0.30606) ->“将空字符串视为 NULL”
每当您在选中复选框的情况下运行它时,它都会失败并出现三个错误:
[Premium_Lookup_trying_to_match_NULLs [74]] 错误:发生错误,并显示以下错误消息:“System.NullReferenceException:未将对象引用设置为对象的实例。(SSIS 生产力包,v22.1.0.30606 - DtsDebugHost,v13.0.4495。 10)”。
[Premium_Lookup_trying_to_match_NULLs [74]] 错误:Premium_Lookup_trying_to_match_NULLs 无法处理数据。
[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“查找表输入”(79) 时,组件“Premium_Lookup_trying_to_match_NULLs”(74) 上的 ProcessInput 方法失败,错误代码为 0xC02090F9。所识别的组件从 ProcessInput 方法返回错误。该错误特定于该组件,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。
即使它有效,也无济于事,因为它只会用 NULL 替换空字符串,这可能会再次将行传递到不匹配的输出,就像一开始一样,因此替换 NULL:s 不会获得任何结果首先是空字符串。
解决方法
因此,当我将两列的匹配设置为“忽略”时,查找就会开始工作,而我不会从“高级查找”工具中获得任何匹配项。
我的解决方法是,如果第 1 侧为 NULL,则将第 1 侧替换为第 2 侧,然后,它按应有的方式运行,但是如果两侧都已填充,这也会减少一次匹配的机会,并且我想在以下情况下获得两个匹配分数两列已填充。
因此,解决方法只是第二个最佳方法,因为我希望查找只跳过 NULL:s 或给它们 0 得分,因为缺少的得分点在找到的匹配集上平均。
问题
对于具有两侧的查找与只有一侧的主输入的查找,我希望将查找的两侧与主输入进行匹配。如果存在 NULL,我不只是想将查找面 1 替换为查找面 2。我怎样才能做到这一点,同时仍然跳过 NULL:s 或给它们 0 分,而不是将行丢失到不匹配的输出,就像这里发生的那样?
总长DR
Premium Lookup 工具可以处理 NULL 值。
通过删除所有内容(包括高级查找框)来重建整个数据流,即使它似乎知道您同时更改了什么。在新数据流中,一切正常。确保您尝试匹配的字符串具有完全相同的格式(大小写、空格等,您可以通过选中高级查找或 SQL 中的复选框来实现这一点)。
“快速”修复是重新构建所有内容并处理格式
有一个快速解决方案,这是学习路径。
我想知道为什么如果我匹配“birtday”或“sex”列,但不能匹配“first name”或“name”,我可以获得匹配分数。这是因为“Premium Lookup Component Editor”中默认有一个新的匹配对如果我匹配 的生日
char(8)
,则默认为 75 % 速度并标记前两个复选框:但是当我添加名称列时,“高级设置”默认为第二个标记的复选框和 0% 速度:
当我从头开始进行全新查找时,默认值甚至什么都没有:
我有一个默认值,它不会忽略这种情况,尽管这是需要的。
事实证明,我仅在查找端将 SQL 中的列更改为小写,而不是在主输入端,这就是为什么第 2 端名称列无法匹配。因为我认为将两个数据流更改为小写字母已经完成,所以我没有检查它,而且即使在经常阅读大写字母时我也会监督它,因为我也保留一列格式不变。
考虑到一切都已经是小写了,我只将“相似度阈值”滚动到 1%:
因此,如果您自己没有将文本列更改为默认值,则应该选中顶部的其他两个框。我将速度设置为 75% 最佳速度,因为它是在其他默认值中选择的,因为此模糊查找与 100% 统计数据无关。
完成后,这将导致所有列的分数:
总体而言,所需的统计数据是:
因此,查找工具按其应有的方式工作,即使某些值为 NULL,也可以看到所有人的平均分数。
再一次,我遇到了很多没有任何分数或分数太少的奇怪行,并且我找到了一些样本,通过快速研究我知道肯定存在匹配,因为其中根本没有 NULL 值。我检查了整个数据流中的每个框,在重建了一些框后,对于在清理之前有一些分数的设置来说,根本没有分数。
我决定:
因此,1.):
我确保对所有需要它的六列都完成了此操作(1x2 用于主输入,2x2 用于查找)。
以及 2.):
您听说过这部电视剧吗?例如“SSIS Crowd”之类的?比如:你是否尝试过断断续续地构建它?
结果
数据流
因此,32 行的 160 意味着对于所有数据,显示“_richness_rank”的前 5 个。
尚未完成的内容:您应该首先按“ID”对输出进行排序,然后按“_richness_rank”对输出进行排序,因为输出并不总是排序的,有时排名不合适。
您可能想要删除任何具有相同 ID 并因此具有相同条目的匹配项,在此数据流中,这会从 32 个“ID”行中删除 10 行:
表输出(统计列)
我们看到,top 1 有时会被删除,这只是查找中具有相同主数据 ID 的 10 次。我也可以在查找之前删除这些行,但我认为最好知道 ID 是否在主数据中,只需滚动即可清楚地了解。无论如何,前五名都是一个模糊的数字,第一名或第二名应该是唯一明确的匹配。