原文发布时间:2018-05-17 09:59:03
什么是FeatureJoiner?
FeaturesJoiner是将数据连接在一起的转换器,它最接近FeatureMerger(并且可能最终取代它)。它在工作空间中是这样的:
该工作区将Facility要素与PostalAddress要素相结合。你可以看到,代替Requestor/Supplier这个转换器有Left/Right端口,少一个输出端口; 但除此之外它确实看起来像FeatureMerger。
但是,查看参数对话框会发现更多差异:
Join On,Conflict Resolution和Geometry Handling参数非常明显,与FeatureMerger中已有的类似。但是关键参数是Join Mode。
Join Modes
要了解Join Mode就有必要了解左连接和内连接。Join Mode选择的三种模式是左连接,内连接和全连接。
模式 |
描述 |
图片描述 |
Joined |
Unjoined Left |
Unjoined Right |
Left |
Left端口要素寻找匹配的要素并且无论是否找到匹配要素都输出 |
|
所有的匹配要素加上没有匹配的要素 |
无 |
没有用上的Right端口要素 |
Inner |
Left端口要素寻找匹配的要素并且只输出匹配了的要素 |
|
只输出匹配了的要素 |
没有找到匹配的Left要素 |
没有用上的Right端口要素 |
Full |
无论是否找到连接,Left和Right要素都会成Joined output端口输出 |
|
所有匹配上的要素加上没有找到匹配的Left和Right要素 |
无 |
无 |
理解操作的最简单方法是:每个图中的重叠部分总是输出。这是一个连接,所以这些功能通过连接端口输出。
Left / Inner / Full参数不控制连接了的的要素,而是未连接的要素。
l 在Inner模式下,没有连接的要素通过Unjoined Left或Unjoined Right端口输出。
l 在Left模式下,没有匹配的Left要素仍然通过Joined端口输出,没有匹配的Right要素通过Unjoined Right端口输出。
l 在Full模式下,没有匹配的Left和Right要素仍然通过Joined端口输出。
Facility例子
接下来以Facility/Address为例,如何实现将Facility要素和 Address记录相匹配。
在Inner模式下,只有匹配了Address的Facility才会通过Joined端口输出,如果你想得到没有匹配的要素,那么通过UnjoinedLeft端口输出的就是。
但是在Left模式下,不管Facility要素是否有匹配的,都会通过Joined端口输出。输出的数据质量并不是很好,但是如果我们知道并不是所有的Facility都有匹配的Address,那这个模式也很好。
在Full模式下,Joined端口输出的要素包括了所有的Address,在这个例子的情况下可能不需要,但是在其他时候可能会用上。
到这里,你会注意到FeaturesJoiner没有 与FeaturesMerger“handle duplicate suppliers”参数等效的功能。要理解这点你需要知道我们的主旨是“Match”
Multiple Join Matches
为了理解这一点我们来看看包含了要素计数的数字:
多少要素将从Joined端口输出呢?这得看情况。
如果我们假设每个Facility和一个Address之间严格1:1匹配,则8个要素将以连接的方式输出。为什么?因为我们有8对匹配。计数将如此:
Full模式下的Joined端口输出的1463442个要素包括了连接上了的8个要素,以及没有连接上的1463434个要素。
这很好。但是,我们可能在Facility和Address表之间没有这样一个纯粹的1:1匹配。我们可能会遇到1:M,M:1,甚至M:M的情况。
假设每个Facility在Address中有两个匹配项,我们会得到这个:
为什么我们会得到比Left端口输入的更多的要素呢?因为每一次匹配我们都会得到一条要素,这里出现了16次匹配。
这是FeaturesMerger做不到的,它会忽略掉第二个匹配或者创建一个列表,但是FeaturesJoiner是按照SQl等价的方式设计的,所以它工作的方式不同。事实上在极端的情况下,我们假设每个Facility都有AddressID=1,并且每个Address都有AddressID=1,那么每个Facility都会匹配到每个Address!
那么我们会得到8 x 1463442个匹配。
换句话说,在Left或Inner模式下我们可以输入8个“requestor”要素并且得到11707536个要素,这没有错只是可能和你的习惯不同。
输出顺序
作为高级主题的一部分,匹配要素从转换器输出的顺序和从Left端口输入的顺序相同。因此如果Left要素在进入转换器时安装特定的顺序排序,那么对于Left模式或者Inner模式,该顺序在输出中将保持不变。
如果在Full模式下要保持完整的顺序不变,那么Left和Right要素必须按照顺序排序。
使用哪个转换器?
那么你应该使用哪种转换器?那么需要考虑两个方面:功能和性能。
对于使用数据库术语和功能的用户来说,FeatureJoiner在功能上来说肯定更好。它旨在模仿SQL,因此结果应该与输入相同的SQL连接命令相同。
关键的输出差异是FeatureJoiner的每个要素匹配概念。FeatureMerger会让你创建一个列表。但是我想说,很多时候你立即使用ListExploder将列表分解为要素,所以我不确定在FeatureJoiner中没有List参数会带来多大的不便。
另外,如果你确实需要列表,使用ListBuilder对Joined端口输出的要素进行创建列表,并且按照连接关键属性进行分组。这是输出顺序很重要的地方,因为如果FeatureJoiner输入适当排序,你可能可以在ListBuilder中设置按组排序的输入。
至于性能,FeatureJoiner拥有改进的设计,并通过使用加速许多其他读模块,写模块和转换器的“要素表”技术获得更多的提升。所以如果性能很重要,那么你绝对应该试用FeatureJoiner。
总结
起初,您可能会更熟悉熟悉的FeatureMerger,但至少尝试使用FeatureJoiner是值得的。
你甚至可以学习一些术语来帮助你实现理想的工作!