如何满怀期望地测试您的数据
作为 Write for DOnations 计划的一部分,作者选择了 Diversity in Tech Fund 来接受捐赠。
介绍
在本教程中,您将设置 Great Expectations 的本地部署,这是一个用 Python 编写的开源数据验证和文档库。 数据验证对于确保您在管道中处理的数据是正确的并且不存在由于错误(例如不正确的输入或转换错误)而可能发生的任何数据质量问题至关重要。 Great Expectations 允许您对称为 Expectations 的数据建立断言,并使用这些期望验证任何数据。
完成后,您将能够将 Great Expectations 连接到您的数据,创建一组 Expectations,使用这些 Expectations 验证一批数据,并生成包含验证结果的数据质量报告。
先决条件
要完成本教程,您需要:
- Python 3.6 或更高版本的本地开发环境。 您可以按照本系列中针对您的操作系统的教程进行操作:如何为 Python 3 安装和设置本地编程环境。 建议使用本地编程环境以避免连接到浏览器时出现问题。
- 对 Python 有一定的了解。 您可以查看 如何在 Python 中编码电子书 以了解更多信息。
- 对 Jupyter notebooks 有一定的了解。
- Git 的工作安装。
- Web 浏览器,例如 Firefox 或 Chrome。
第 1 步 — 安装 Great Expectations 并初始化 Great Expectations 项目
在这一步中,您将在本地 Python 环境中安装 Great Expectations 包,下载您将在本教程中使用的示例数据,并初始化一个 Great Expectations 项目。
首先,打开一个终端并确保激活您的虚拟 Python 环境。 使用以下命令安装 Great Expectations Python 包和命令行工具 (CLI):
pip install great_expectations==0.13.35
注意:本教程是为远大前程0.13.35版本开发的,可能不适用于其他版本。
要访问示例数据存储库,请运行以下 git 命令来克隆目录并将其更改为您的工作目录:
git clone https://github.com/do-community/great_expectations_tutorial cd great_expectations_tutorial
该存储库仅包含一个名为 data
的文件夹,其中包含两个示例 CSV 文件,其中包含您将在本教程中使用的数据。 看一下data
目录的内容:
ls data
您将看到以下输出:
Outputyellow_tripdata_sample_2019-01.csv yellow_tripdata_sample_2019-02.csv
Great Expectations 适用于许多不同类型的数据,例如与关系数据库、Spark 数据帧和各种文件格式的连接。 出于本教程的目的,您将使用这些包含一小组出租车乘车数据的 CSV 文件开始。
最后,通过运行以下命令将您的目录初始化为 Great Expectations 项目。 确保使用 --v3-api
标志,因为这会将您切换到使用包的最新 API:
great_expectations --v3-api init
当询问 [X11X] 时,按 ENTER
继续。
这将创建一个名为 great_expectations
的文件夹,其中包含您的 Great Expectations 项目的基本配置,也称为 Data Context。 您可以检查文件夹的内容:
ls great_expectations
您将看到在 great_expectations
文件夹中创建的第一级文件和子目录:
Outputcheckpoints great_expectations.yml plugins expectations notebooks uncommitted
这些文件夹存储了您的 Great Expectations 设置的所有相关内容。 great_expectations.yml
文件包含所有重要的配置信息。 在继续本教程的下一步之前,请随意探索文件夹和配置文件。
在下一步中,您将添加一个数据源以将 Great Expectations 指向您的数据。
第 2 步 — 添加数据源
在这一步中,您将在 Great Expectations 中配置一个数据源,它允许您自动创建名为 Expectations 的数据断言,并使用该工具验证数据。
在您的项目目录中,运行以下命令:
great_expectations --v3-api datasource new
您将看到以下输出。 输入提示为 data
目录配置基于文件的数据源时显示的选项:
OutputWhat data would you like Great Expectations to connect to? 1. Files on a filesystem (for processing with Pandas or Spark) 2. Relational database (SQL) : 1 What are you processing your files with? 1. Pandas 2. PySpark : 1 Enter the path of the root directory where the data files are stored. If files are on local disk enter a path relative to your current working directory or an absolute path. : data
用 ENTER
确认目录路径后,Great Expectations 会在你的浏览器中打开一个 Jupyter notebook,它可以让你完成 Datasource 的配置并将其存储到你的 Data Context 中。 以下屏幕截图显示了笔记本的前几个单元格:
该笔记本包含几个预先填充的 Python 代码单元,用于配置您的数据源。 您可以根据需要修改数据源的设置,例如名称。 但是,就本教程而言,您将保留所有内容并使用 Cell > Run All
菜单选项执行所有单元格。 如果运行成功,最后一个单元格输出将如下所示:
Output[{'data_connectors': {'default_inferred_data_connector_name': {'module_name': 'great_expectations.datasource.data_connector', 'base_directory': '../data', 'class_name': 'InferredAssetFilesystemDataConnector', 'default_regex': {'group_names': ['data_asset_name'], 'pattern': '(.*)'}}, 'default_runtime_data_connector_name': {'module_name': 'great_expectations.datasource.data_connector', 'class_name': 'RuntimeDataConnector', 'batch_identifiers': ['default_identifier_name']}}, 'module_name': 'great_expectations.datasource', 'class_name': 'Datasource', 'execution_engine': {'module_name': 'great_expectations.execution_engine', 'class_name': 'PandasExecutionEngine'}, 'name': 'my_datasource'}]
这表明您已将一个名为 my_datasource
的新数据源添加到您的数据上下文中。 在继续下一步之前,请随意阅读笔记本中的说明以了解有关不同配置选项的更多信息。
警告: 在继续之前,请关闭带有笔记本的浏览器选项卡,返回终端,然后按 CTRL+C
关闭正在运行的笔记本服务器,然后再继续。
您现在已经成功设置了指向 data
目录的数据源,这将允许您通过 Great Expectations 访问目录中的 CSV 文件。 在下一步中,您将在数据源中使用其中一个 CSV 文件来使用探查器自动生成期望值。
第 3 步 — 使用自动分析器创建期望套件
在本教程的这一步中,您将使用内置的 Profiler 根据一些现有数据创建一组期望。 为此,让我们仔细看看您下载的示例数据:
- 文件
yellow_tripdata_sample_2019-01.csv
和yellow_tripdata_sample_2019-02.csv
分别包含 2019 年 1 月和 2 月的出租车乘车数据。 - 本教程假设您知道一月份的数据是正确的,并且您希望确保任何后续数据文件在数量或行数、列以及某些列值的分布方面与一月份的数据相匹配。
为此,您将基于 1 月数据的某些属性创建期望(数据断言),然后在后续步骤中使用这些期望来验证 2 月数据。 让我们从创建一个期望套件开始,它是一组组合在一起的期望:
great_expectations --v3-api suite new
通过选择下面输出中显示的选项,您可以指定要使用分析器自动生成期望值,使用 yellow_tripdata_sample_2019-01.csv
数据文件作为输入。 出现提示时输入名称 my_suite
作为 Expectation Suite 名称,并在询问时在末尾按 ENTER
Would you like to proceed? [Y/n]
:
OutputUsing v3 (Batch Request) API How would you like to create your Expectation Suite? 1. Manually, without interacting with a sample batch of data (default) 2. Interactively, with a sample batch of data 3. Automatically, using a profiler : 3 A batch of data is required to edit the suite - let's help you to specify it. Which data asset (accessible by data connector "my_datasource_example_data_connector") would you like to use? 1. yellow_tripdata_sample_2019-01.csv 2. yellow_tripdata_sample_2019-02.csv : 1 Name the new Expectation Suite [yellow_tripdata_sample_2019-01.csv.warning]: my_suite When you run this notebook, Great Expectations will store these expectations in a new Expectation Suite "my_suite" here: <path_to_project>/great_expectations_tutorial/great_expectations/expectations/my_suite.json Would you like to proceed? [Y/n]: <press ENTER>
这将打开另一个 Jupyter 笔记本,让您完成 Expectation Suite 的配置。 该笔记本包含大量用于配置内置分析器的代码,该分析器查看您选择的 CSV 文件,并根据在数据中找到的内容为文件中的每一列创建特定类型的期望。
向下滚动到笔记本中的第二个代码单元,其中包含 ignored_columns
列表。 默认情况下,分析器将忽略所有列,因此让我们注释掉其中的一些列,以确保分析器为它们创建期望。 修改代码,使其看起来像这样:
ignored_columns = [ # "vendor_id" # , "pickup_datetime" # , "dropoff_datetime" # , "passenger_count" "trip_distance" , "rate_code_id" , "store_and_fwd_flag" , "pickup_location_id" , "dropoff_location_id" , "payment_type" , "fare_amount" , "extra" , "mta_tax" , "tip_amount" , "tolls_amount" , "improvement_surcharge" , "total_amount" , "congestion_surcharge" ,]
确保删除 "trip_distance"
之前的逗号。 通过注释掉 vendor_id
、pickup_datetime
、dropoff_datetime
和 passenger_count
列,您是在告诉分析器为这些列生成期望值。 此外,profiler还会生成表级Expectations,比如你数据中的列数和名称,以及行数。 再次,使用 Cell > Run All
菜单选项执行笔记本中的所有单元格。
执行此笔记本中的所有单元格时,会发生两件事:
- 该代码使用自动分析器和您告诉它使用的
yellow_tripdata_sample_2019-01.csv
文件创建一个期望套件。 - 笔记本中的最后一个单元格也配置为运行验证并使用 Data Docs 打开一个新的浏览器窗口,这是一份数据质量报告。
在下一步中,您将仔细查看在新浏览器窗口中打开的数据文档。
第 4 步 — 探索数据文档
在本教程的这一步中,您将检查 Great Expectations 生成的数据文档,并学习如何解释不同的信息。 转到刚刚打开的浏览器窗口并查看页面,如下面的屏幕截图所示。
在页面顶部,您将看到一个标题为 Overview 的框,其中包含有关您刚刚使用新创建的 Expectation Suite my_suite
运行的验证的一些信息。 它会告诉你 Status: Succeeded
并显示一些关于运行了多少期望的基本统计数据。 如果进一步向下滚动,您将看到标题为 表级期望 的部分。 它包含两行期望,显示每行的状态、期望和观察值。 在期望表下方,您将看到您在笔记本中注释掉的每个列的列级期望。
让我们关注一个特定的期望:passenger_count
列有一个期望,声明“值必须属于这个集合:1 2 3 4 5 6
”。 它标有绿色复选标记,观察值为“0% unexpected”。 这告诉您,分析器查看了 1 月份 CSV 文件中 passenger_count
列中的值,并且仅检测到值 1 到 6,这意味着所有出租车行程都有 1 到 6 名乘客。 伟大的期望然后为这个事实创造了一个期望。 笔记本中的最后一个单元格随后触发了对 1 月 CSV 文件的验证,并且没有发现意外值。 这是虚假的,因为用于创建期望的相同数据也是用于验证的数据。
在此步骤中,您查看了数据文档并观察了 passenger_count
列的期望值。 在下一步中,您将了解如何验证不同批次的数据。
第 5 步 — 创建检查点并运行验证
在本教程的最后一步中,您将创建一个新的检查点,它捆绑了一个期望套件和一批数据以执行该数据的验证。 创建检查点后,您将运行它以验证 2 月出租车数据 CSV 文件,并查看该文件是否通过了您之前创建的预期。 首先,如果 Jupyter notebook 仍在运行,请返回终端并按 CTRL+C
停止它。 以下命令将启动工作流以创建一个名为 my_checkpoint
的新检查点:
great_expectations --v3-api checkpoint new my_checkpoint
这将打开一个 Jupyter 笔记本,其中包含一些预填充的代码来配置检查点。 笔记本中的第二个代码单元将有一个从现有数据源预填充的随机 data_asset_name
,这将是您之前看到的 data
目录中的两个 CSV 文件之一。 确保 data_asset_name
为 yellow_tripdata_sample_2019-02.csv
并根据需要修改代码以使用正确的文件名。
my_checkpoint_name = "my_checkpoint" # This was populated from your CLI command. yaml_config = f""" name: {my_checkpoint_name} config_version: 1.0 class_name: SimpleCheckpoint run_name_template: "%Y%m%d-%H%M%S-my-run-name-template" validations: - batch_request: datasource_name: my_datasource data_connector_name: default_inferred_data_connector_name data_asset_name: yellow_tripdata_sample_2019-02.csv data_connector_query: index: -1 expectation_suite_name: my_suite """ print(yaml_config) """
此配置片段配置一个新的检查点,它读取数据资产 yellow_tripdata_sample_2019-02.csv
,即您的 2 月 CSV 文件,并使用 Expectation Suite my_suite
对其进行验证。 确认您已正确修改代码,然后执行笔记本中的所有单元格。 这会将新的检查点保存到您的数据上下文中。
最后,为了运行这个新的检查点并验证 2 月的数据,向下滚动到笔记本中的最后一个单元格。 取消注释单元格中的代码,如下所示:
context.run_checkpoint(checkpoint_name=my_checkpoint_name) context.open_data_docs()
选择单元格并使用 Cell > Run Cells
菜单选项或 SHIFT+ENTER
键盘快捷键运行它。 这将在新的浏览器选项卡中打开 Data Docs。
在验证结果概览页面上,单击最上面的运行以导航到验证结果详细信息页面。 验证结果详细信息页面看起来与您在上一步中看到的页面非常相似,但现在它将显示 Expectation Suite 失败,验证新的 CSV 文件。 滚动页面以查看哪些期望旁边有一个红色的 X,将它们标记为失败。
在上一步中查看的 passenger_count
列上找到期望值:“值必须属于此集合:1 2 3 4 5 6
”。 您会注意到它现在显示为失败并突出显示 1579 unexpected values found. ≈15.79% of 10000 total rows
。 该行还显示在该列中发现的意外值的样本,即值 0
。 这意味着 2 月份的出租车乘车数据突然引入了 0
列中的意外值,如 passenger_counts
列,这似乎是一个潜在的数据错误。 通过运行检查点,您使用 Expectation Suite 验证了新数据并检测到此问题。
请注意,每次在最后一个笔记本单元格中执行 run_checkpoint
方法时,都会启动另一个验证运行。 在生产数据管道环境中,每当您处理一批新数据时,您都可以在笔记本之外调用 run_checkpoint
命令,以确保新数据通过所有验证。
结论
在本文中,您为数据验证创建了 Great Expectations 框架的第一个本地部署。 您初始化了一个 Great Expectations 数据上下文,创建了一个新的基于文件的数据源,并使用内置分析器自动生成了一个 Expectation Suite。 然后,您创建了一个检查点来对一批新数据运行验证,并检查数据文档以查看验证结果。
本教程只教你远大前程的基础知识。 该包包含更多用于配置数据源以连接到其他类型的数据的选项,例如关系数据库。 它还带有一个强大的机制,可以根据表名或文件名中的模式匹配自动识别新批次的数据,这允许您只配置一次检查点来验证任何未来的数据输入。 您可以在官方文档中了解更多关于远大期望。