原文链接: https://blog.safe.com/2019/01/change-detection-2019-fmeevangelist184/
最近我讨论了关于数据库的更新,提到有两个常见的场景。 一种是你收到更新日志——要更新的列表——将它们应用到你的控制数据库。这是简单的一种情况,因为你提前知道变化的内容以及需要更新的要素。
第二种更新是你收到一个完整的新数据集,没有任何提示告知哪些是新增的或更新的。这种情况就需要你进行变化检测。这之前,我们经常使用FME Hub转换器的一个叫做UpdataDetector的转换器。但是在2019中,我们对ChangeDetector转换器做了很好的更新升级,从现在开始,它应该成为你的首选转换器。
一、变化检测: 有什么新的功能?在2018及之前的版本中,ChangeDetector转换器将“original”端口的数据集与“revised”端口的进行比较,然后将要素分别输出到Added,Deleted和Unchanged端口。 - Added: 在修订(revised端)数据集中存在,而原始数据集中不存在的记录
- Deleted: 在原始数据集中存在,而修订(revised)数据集中不存在的记录
- Unchanged: 修订(revised)数据集中与原始数据集中匹配的记录
但是,它无法识别更改的记录。如果一个记录在修订数据和原始数据中都存在,但是现在它的属性值不同,那么将被当作一个新的要素(从Added输出)。这使得执行“更新”(记录已经存在时,进行数据库更新)变得困难,因为很难判断某个要素是否是真正的新要素。
在2019中,这个转换器能够处理更新记录。新转换器的设计将更新的要素通过Updated输出端口输出: 所以这是非常重要的。它极大的拓宽了这个转换器的变化检测范围。 但是,存在原始要素与修订要素进行匹配时的问题。没有原始记录进行比较,FME无法判断修订要素是否被更新。这个通过关键属性值来完成,意味着2019中ChangeDetector具有新的参数: 我们马上来看一个例子。现在先观察,在参数对话框中有一个叫做Update Detection Key Attributes的参数,通过它来选择ID或关键值。 如果这个功能听起来很熟悉,很可能是因为我们在FME Hub转换器中有个叫做UpdateDetector的转换器……
二、替换FME Hub的UpdateDetector创建UpdateDetector是为了填补ChangeDetector功能的空白。根据它的下载数量可知它是一个非常受欢迎的转换器。但是现在它已经被弃用了:
新的ChangeDetector不止替换hub上的这个转换器,它还在功能和性能两个方面进行了提升。已经有UpdateDetector的工作空间还是可以使用,但是我们建议你使用新的ChangeDetector进行替换。 现在我们来看一个关于新的ChangeDetector如何工作的例子……
三、ChangeDetector 例子假设我有一个地址数据库:
除此之外我还收到一个数据的新版本。现在我必须知道哪些地址记录发生了变化,这样我才能把变化推送到数据库中。我只需对每个数据集添加读模块,并将它们连接到ChangeDetector:
这里我看到在原始数据和修订数据之间,有35条记录发生了变化,其中2条新增记录。同时在修订数据中删除了13条记录。大部分记录都没有发生变化。 现在看一下我的转换器参数设置:
- GlobalID是更新检测的关键属性。这个属性告诉FME如何对原始数据和修订数据进行匹配。
- Selected attribues(选中属性)是我用于检查变化的属性。例如,如果两个记录具有匹配的GlobalID,检查这些属性之间的差异。
- 这个标记告诉转换器对于空间数据集,同时检测几何图形。一些高级参数用于控制精确的检测(如下)。
- 这个参数定义了一个列表,用来存储发生的变化;例如:哪个属性不同以及如何发生变化。
正如参数稍有不同,输出的结果也如此…… 3.1 新的变化检测输出由于ChangeDetector转换器现在检测匹配——不是每个属性都必须检测——所以原始记录和修订记录并不完全相同时,也可能被当作匹配记录。例如,属性a,b和c相同,但是属性d不同。这样的要素仍然匹配,这是因为在匹配选中属性(Selected Attributes)这里没有选择属性d。 要处理该场景,参数允许你输出匹配要素中的任何一个或两个: 如果你输出所有要素,将为要素添加属性Match ID,这样便于你区分相互匹配的要素。 另外,通过设置列表名称,输出要素记录原始数据和修订数据间的不同。例如,这个记录具有两处不同: 列表告诉我们有两个属性(OWNERNM1 和OWNERNM2)的属性值被修改,而这个列表: …告诉我们要素的几何对象被修改。 同样如UpdateDetector已有,这个转换器设置fme_db_operation 属性。这里时删除记录(在原始数据中有,而修订数据中没有的记录)的例子: 这意味着我可以直接把要素输入到数据库写模块,指定要素操作(fme_db_operatio)和匹配字段(这里为GlobalID)…… …我的地址数据库将自动进行必要的更新、增加和删除的修改操作。 四、新的容差算法你应该注意到一个叫做Vector Tolerance的新的高级几何参数: 尽管有这个名字,但是与之前在FME 2018时讨论的容差设置不一样。为何这个容差不同呢?因为这里它不是试图找到两条线在哪里相交或者试图调整已有的点。相反,它是使用叫做Fréchet distance(费雷歇距离)的方法来查找两个要素是否在设定的容差范围内, Fréchet distance(费雷歇距离)是利用两个要素间的距离得到两个空间要素(通常是“曲线”)相似性的度量。 常见而简单解释就是遛狗。比如说你牵着狗走在小路上。你走在一条相对较直的线上(红线,A,下方),但你的狗会左右移动,以便闻树(蓝线,B): 问题在于你们每个人走自己的路需要多长时间?在上图中,小狗和步行者路线间的最大距离标记为F。如果小狗的牵引距离至少为F,那么我们可以各自走自己的路,而不会被相互牵引。 这个概念给变化检测提供了很好的解决方案。在FME中,如果原始要素和修订要素间的Fréchet distance(费雷歇距离)小于指定的容差值,则认为要素没有发生变化。 我们觉得这个算法比以前的方法有改进。它适用于更多的几何类型,也可以应用于有容差的宽松匹配模式,这在以前是不可能的。 4.1 Fréchet? 哪个Fréchet?如果你不参与几何计算,请跳过这个部分。然而,对于你熟悉的Fréchet distances(费雷歇距离),你会发现这是真正的费雷歇,而不是离散的费雷歇(只有计算顶点之间的距离)。当Lenient Geometry Matching(宽松几何匹配)参数启用时,FME将使用Weak Fréchet(弱费雷歇): 当步行者或小狗被允许回退时,这就是Weak Fréchet(弱费雷歇)。在True Fréchet(真费雷歇)中,他们需要保持前进。 在这个例子中,遛狗者(A)保持走在一条直线上。小狗刚开始保持直线(b1),但是一下转到右边(b2)。他们仍然沿着路线向前,但是他们的路线方向不同: 在True Fréchet(真费雷歇)中,步行者无法改变他们的路线来消灭这种偏差。他们最多能做的是停在当前的位置。例如步行者在点a1停下等待缩小牵引距离,而狗则遵循它们的蜿蜒路径: 也许,这可能是类比分解的地方。 Frechet distances(费雷歇距离)是在事先知道路径的情况下计算出来的,而在现实生活中不可能知道狗会走哪条路线! 无论如何,在弱费雷歇(Weak Fréchet)中,步行者被允许改变他们的路线。当小狗开始从b1到b2时,步行者可以折回到a2,以缩短Fréchet(费雷歇)距离: 如果你不理解,你也不必担心。只需要观察这两个路线,并记住Lenient Geometry Matching(宽松几何匹配)选项意味着这两个要素更有可能被归类为一个匹配。 五、更多变化检测信息上述的例子展示了新的变化检测效果。但是,在很多情况下你可能希望执行旧的ChangeDetector的Added/Deleted/Unchanged(增加/删除/未变化)的效果,你不需要查找修改的记录。 如果需要这样的情况,只需要简单的将Update Detection Key(更新检测键值)参数留空: 这样要素将根据他们来自Original输入端口或Revised端口分别被识别为插入(Inserted)或删除(Deleted): 然后如果你没有2019,你仍然可以下载UpdateDetector。现在,术语“UpdateDetector”仅作为ChangeDetector的别名出现在Workbench中; 因此,通过FME Hub访问转换器,确保在界面中选中Show Deprecated选项。
另外,Matcher转换器在2019中做了一个小的改动。它的参数对话框已更新,并获得与ChangeDetector相同的容差参数和算法。 六、总结这就是关于变化检测更新的内容。现在你读了这篇文章,当你升级到FME2019后,看到ChangeDetector新的对话框后,就不会那么惊讶了。 我相信这是一个很有用的更新,我也很期待使用它。
本文转载来自CSDN作者:fmechina 版权归作者所有 原文链接:https://blog.csdn.net/fmechina/article/details/88655242?spm=1001.2014.3001.5501
|