在 AWS Glue 中使用 Zingg 开源库进行实体解析和模糊匹配 大数据博客
在 AWS Glue 中使用 Zingg 开源库进行实体解析与模糊匹配
关键要点
实体解析是数据治理的重要一环,能够链接来自不同来源的数据。AWS Glue 是一种无服务器的数据集成服务,能够通过第三方 Spark 库进行扩展。Zingg 是一个基于机器学习的开源库,可用于在 Spark 上进行实体解析。本文将演示如何在 AWS Glue 笔记本中使用 Zingg 的实体解析能力。在当今数据驱动的世界中,组织通常需要处理来自多个来源的数据,这给数据集成和治理带来了挑战。AWS Glue 是一种无服务器的数据集成服务,简化了数据发现、准备、移动和集成的过程,以便于分析、机器学习ML和应用开发。
实体解析是数据治理的一个关键方面,它旨在将来自不同来源的表示同一实体的数据建立链接,尽管这些数据并不完全相同。这个过程对于维护数据完整性至关重要,并避免由于重复数据而导致的分析扭曲。
AWS Glue 基于 Apache Spark 框架,具备通过第三方 Spark 库扩展其功能的灵活性。其中一个强大的开源库是 Zingg,这是一种专为 Spark 上的实体解析而设计的基于机器学习的工具。
在这篇文章中,我们将探讨如何在 AWS Glue 笔记本中使用 Zingg 的实体解析功能,您可以将其作为提取、转换和加载ETL作业运行。通过在您的笔记本或 ETL 作业中集成 Zingg,您能够有效解决数据治理挑战,并为组织提供一致准确的数据。
解决方案概述
本用例与 使用 AWS Lake Formation FindMatches 集成和去重数据集 中的情况相同。
它包括一个出版物数据集,该数据集存在许多重复项,因为标题、名称、描述或其他属性略有不同。这种情况通常发生在从不同来源收集信息时。
在本文中,我们使用相同的数据集和训练标签,但展示如何使用 Zingg 这个第三方实体解析库来实现。
前提条件
为了跟随本文,您需要以下条件:
一个能够登录 AWS 管理控制台 并创建和运行 AWS Glue 笔记本的 AWS 用户或角色。例如,拥有 AWSGlueConsoleFullAccess 策略的管理员角色。一个 Amazon Simple Storage Service (Amazon S3) 存储桶来存储库、模型和输出。有关创建存储桶的说明,请参见 创建第一个 S3 存储桶。一个角色,用于运行 AWS Glue 笔记本,并在上述存储桶上具有 Amazon S3 权限。有关创建角色的说明,请参阅 在 AWS Glue Studio 中开始使用笔记本。设置所需文件
为了运行笔记本或稍后作为作业运行,您需要设置 Zingg 库和配置。请按照以下步骤操作:
下载适用于 AWS Glue 40 的 Zingg 发行包,此版本使用 Spark 330。适当的版本是 Zingg 034。解压缩 tar 文件中的 JAR 文件 zingg034SNAPSHOTjar,并将其上传到您的 S3 存储桶根目录。创建一个名为 configjson 的文本文件,并输入以下内容,请在指示的位置提供您的 S3 存储桶的名称,然后将文件上传到存储桶根目录:
json{ fieldDefinition[ { fieldName title matchType fuzzy fields fname dataType string } { fieldName authors matchType fuzzy fields fname dataType string } { fieldName venue matchType fuzzy fields fname dataType string } { fieldName year matchType fuzzy fields fname dataType double } ] output [{ nameoutput formatcsv props { location s3//ltyour bucket namegt/matchOuput/ delimiter headertrue } }] data [{ namedblpscholar formatjson props { location s3//mltransformspublicdatasetsuseast1/dblpscholar/records/dblpscholarrecordsjsonl } schema {type struct fields [ {nameid typestring nullablefalse} {nametitle typestring nullabletrue} {nameauthorstypestringnullabletrue} {namevenue typestring nullabletrue} {nameyear typedouble nullabletrue} {namesourcetypestringnullabletrue} ] } }] numPartitions4 modelId 1 zinggDir s3//ltyour bucket namegt/models}
您也可以以编程方式定义配置,但使用 JSON 更容易可视化,并允许您在 Zingg 命令行工具中使用。有关更多详细信息,请参见 库文档。
设置 AWS Glue 笔记本
为了简化,我们使用 AWS Glue 笔记本来准备训练数据、构建模型和查找匹配。请按照以下步骤设置包含 Zingg 库和配置文件的笔记本:
在 AWS Glue 控制台中,选择导航窗格中的 笔记本。选择 创建笔记本。保留默认选项,选择适合笔记本的角色。添加一个新单元格以进行 Zingg 特定配置,输入以下内容,并提供您的存储桶名称:
pythonextrajars s3//ltyour bucketgt/zingg034SNAPSHOTjar extrapyfiles s3//ltyour bucketgt/configjson additionalpythonmodules zingg==034
运行配置单元。确保在运行任何其他单元之前执行此操作,因为如果会话已经启动,配置更改将不会应用。如果发生这种情况,创建并运行一个单元格,内容为 stopsession。这将停止会话,但不会停止笔记本,因此当您再次运行单元格时,将启动一个新的会话,使用您当前定义的所有配置设置。 现在笔记本准备好以开始会话。
使用提供的设置单元创建会话标记为“运行此单元以设置并启动您的交互式会话”。 几秒钟后,您应该会看到会话已创建的消息。
准备训练数据
Zingg 允许提供样本训练对,也可由专家交互定义后者。在这方面,算法会寻找其认为有意义的示例,并询问专家它是否匹配、如果不匹配,或者专家不能决定。该算法可以使用少量的匹配和非匹配样本,但训练数据越大,效果越好。
在此示例中,我们重用原始帖子中提供的标签,该帖子将样本分配给行组称为 clusters,而不是标记个别对。由于我们需要转换这些数据,故可以将其转换为 Zingg 在内部使用的格式,因此无需配置训练样本的定义和格式。要了解更多所需的配置,请参阅 使用现有训练数据。
在已启动会话的笔记本中,添加一个新单元格并输入以下代码,提供您自己的存储桶名称:
pythonbucketname =
sparkreadcsv( s3//mltransformspublicdatasetsuseast1/dblpscholar/labels/dblpscholarlabels350csv header=True)createOrReplaceTempView(labeled)
sparksql(SELECT bookid as zzid sample as zsource zcluster zisMatch booktitle bookauthors bookvenue CAST(bookyear AS DOUBLE) as year booksourceFROM( SELECT explode(pair) as book FROM( SELECT (alabel == blabel) as zisMatch array(struct(a) struct(b)) as pair uuid() as zcluster FROM labeled a labeled b WHERE alabelingsetid = blabelingsetid AND aid != bid)))writemode(overwrite)parquet(fs3//{bucketname}/models/1/trainingData/marked/)print(标记数据准备完成)
运行新单元格。几秒钟后,它将打印出标记数据准备好的消息。

构建模型并查找匹配
创建并运行一个新单元格,内容如下:
pythonscjschadoopConfiguration()set(fsdefaultFS fs3//{bucketname}/)scjschadoopConfiguration()set(mapredoutputcommitterclass orgapachehadoopmapredFileOutputCommitter)from zinggclient import Arguments ClientOptions FieldDefinition Zinggzopts = ClientOptions([phase trainMatch conf /tmp/configjson])zargs = ArgumentscreateArgumentsFromJSON(zoptsgetConf() zoptsgetPhase())zingg = Zingg(zargs zopts)zingginit()zinggexecute()由于同时进行训练和匹配,因此完成此过程需要几分钟。当其完成时,单元格将打印所使用的选项。
如果出现错误,返回到笔记本的信息可能不足以进行故障排除,此时可使用 Amazon CloudWatch。在 CloudWatch 控制台中,选择导航窗格中的 日志组,然后在 /awsglue/sessions/error 下,查找使用时间戳或会话 ID 的驱动程序日志驱动程序日志的 ID 后面没有后缀。
探索算法找到的匹配
根据 Zingg 配置,上一步生成了原始 JSON 数据中找到的匹配的 CSV 文件。创建并运行一个新单元格,内容如下,以可视化匹配文件:
pythonfrom pysparksqlfunctions import colsparkreadcsv(fs3//{bucketname}/matchOuput/ header=True) withColumn(zcluster col(zcluster)cast(int)) drop(zminScore zmaxScore) sort(col(zcluster))show(100 False)这将显示分配的前 100 行。如果分配的集群相同,则这些出版物被视为重复项。
例如,在前面的屏幕截图中,集群 0 或 20 是同一标题的拼写变体,在其他字段中有一些不完整或错误的数据。在这些情况下,出版物被视为重复项。
飞速加速器安卓下载正如在使用 FindMatches 的原始帖子中所述,它在编辑者的注释方面存在困难,集群 12 中有更多可疑的重复项,标题和场所相似,但完全不同的作者表明它不是重复项,而算法需要更多示例来进行训练。
您还可以将笔记本作为作业运行,无论是选择 运行 还是以编程方式运行,此时您需要删除之前创建的单元格以探索输出,以及任何其他不用于进行实体解析的单元格,例如创建笔记本时提供的示例单元格。
其他考虑事项
作为笔记本设置的一部分,您创建了一个包含三个 配置魔法 的配置单元。您可以用设置单元中的魔法替换这些,只要它们在任何 Python 代码之前列出。
其中之一指定了 Zingg 配置 JSON 文件作为额外的 Python 文件,尽管它实际上不是 Python 文件。这是为了使其部署在集群的 /tmp 目录中,并由库访问。您也可以使用库 API 以编程方式指定 Zingg 配置,而无需配置文件。
在构建和运行模型的单元中,有两行调整 Hadoop 配置。这是必需的,因为该库是为在 HDFS 上运行而设计的,而不是 Amazon S3。第一行配置了使用 S3 存储桶作为默认文件系统,以便在需要生成临时文件时,可以写入那里。第二行恢复了与 AWS Glue 默认情况下配置的直接提交者相反的默认提交者。
调用 Zingg 库时,使用 trainMatch 阶段。这是同时进行训练和匹配阶段的快捷方式。它的工作方式与在 Zingg 文档中通常作为示例的命令行中调用阶段的工作方式相同,详细信息请查看 Zingg 文档。
如果您想进行增量匹配,可以对新数据运行匹配,然后在主数据和新数据之间进行链接阶段。有关更多信息,请参见 跨数据集链接。
清理
当您离开笔记本时,交互式会话应停止。您可以通过在 AWS Glue 控制台中选择导航窗格中的 交互式会话,然后按状态排序来验证是否停止,以检查是否有任何正在运行的会话并因此产生费用。如果不打算使用存储桶中的文件,也可以删除它们。
结论
在这篇文章中,我们展示了如何结合第三方 Apache Spark 库扩展 AWS Glue 的能力,并给予您选择的自由。您可以以同样的方式使用自己的数据,随后使用 Amazon 托管的 Apache Airflow 工作流 (Amazon MWAA) 等工具将此实体解析集成到工作流程中。
如果您有任何问题,请在评论中留言。
关于作者
Gonzalo Herreros 是 AWS Glue 团队的高级大数据架构师,拥有机器学习和人工智能的背景。
Emilio Garcia Montano 是亚马逊网络服务的解决方案架构师。他与媒体和娱乐客户合作,支持他们通过机器学习和人工智能实现预期成果。
Noritaka Sekiyama 是 AWS Glue 团队的首席大数据架构师,负责构建帮助客户的软件工件。闲暇时,他喜欢骑公路自行车。