作者选择了Diversity in Tech Fund作为Write for DOnations计划的一部分来接受捐赠。

简介

在本教程中,您将设置Great Expectations的本地部署,这是一个用 Python 编写的开源数据验证和文档库。数据验证对于确保您在管道中处理的数据是正确的并且不存在由于错误(例如不正确的输入或转换错误)而可能发生的任何数据质量问题至关重要。 Great Expectations 允许您对称为_Expectations_ 的数据建立断言,并使用这些期望验证任何数据。

完成后,您将能够将 Great Expectations 连接到您的数据,创建一组 Expectations,使用这些 Expectations 验证一批数据,并生成包含验证结果的数据质量报告。

先决条件

要完成本教程,您需要:

  • Python 3.6 或更高版本的本地开发环境。您可以按照本系列中针对您的操作系统的教程进行操作:如何为 Python 3 安装和设置本地编程环境。建议使用本地编程环境以避免连接到浏览器时出现问题。

  • 对 Python 有一定的了解。您可以查看How to code in Python 电子书以了解更多信息。

  • 对Jupyter notebooks有一定的了解。

  • Git的工作安装。

  • 像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

当询问OK to proceed? [Y/n]:时,请按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。以下屏幕截图显示了笔记本的前几个单元格:

Jupyter 笔记本的屏幕截图

该笔记本包含几个预先填充的 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目录的 Datasource,这将允许您通过 Great Expectations 访问该目录中的 CSV 文件。在下一步中,您将在数据源中使用其中一个 CSV 文件来使用探查器自动生成期望值。

第 3 步 — 使用自动分析器创建期望套件

在本教程的这一步中,您将使用内置的 Profiler 根据一些现有数据创建一组期望。为此,让我们仔细看看您下载的示例数据:

  • 文件yellow_tripdata_sample_2019-01.csvyellow_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 名称,并在询问Would you like to proceed? [Y/n]时在末尾按ENTER:

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_idpickup_datetimedropoff_datetimepassenger_count列,您是在告诉分析器为这些列生成期望值。此外,profiler还会生成_table-level Expectations_,比如你数据中的列数和名称,以及行数。再次使用Cell > Run All菜单选项执行笔记本中的所有单元格。

执行此笔记本中的所有单元格时,会发生两件事:

  1. 代码使用自动分析器和您告诉它使用的yellow_tripdata_sample_2019-01.csv文件创建一个期望套件。

  2. notebook 中的最后一个单元格也被配置为运行验证并打开一个带有_Data Docs_ 的新浏览器窗口,这是一份数据质量报告。

在下一步中,您将仔细查看在新浏览器窗口中打开的数据文档。

第 4 步 - 探索数据文档

在本教程的这一步中,您将检查 Great Expectations 生成的数据文档,并学习如何解释不同的信息。转到刚刚打开的浏览器窗口并查看页面,如下面的屏幕截图所示。

数据文档截图

在页面顶部,您将看到一个标题为 Overview 的框,其中包含有关您刚刚使用新创建的 Expectation Suitemy_suite运行的验证的一些信息。它将告诉您Status: Succeeded并显示一些基本统计信息期望得到满足。如果进一步向下滚动,您将看到标题为 Table-Level Expectations 的部分。它包含两行期望,显示每行的状态、期望和观察值。在期望表下方,您将看到您在笔记本中注释掉的每个列的列级期望。

让我们关注一个特定的期望:passenger_count列有一个期望,说明“值必须属于此集合:1 2 3 4 5 6”。它标有绿色复选标记,观察值为“0% 意外”。这告诉您,分析器查看了 1 月 CSV 文件中passenger_count列中的值,并且仅检测到值 1 到 6,这意味着所有出租车行程都有 1 到 6 名乘客。伟大的期望然后为这个事实创造了一个期望。笔记本中的最后一个单元格随后触发了对 1 月 CSV 文件的验证,并且没有发现意外值。这是虚假的,因为用于创建期望的相同数据也是用于验证的数据。

在此步骤中,您查看了数据文档并观察了passenger_count列的期望值。在下一步中,您将看到如何验证不同批次的数据。

第 5 步 - 创建检查点并运行验证

在本教程的最后一步中,您将创建一个新的检查点,它捆绑了一个期望套件和一批数据以执行该数据的验证。创建检查点后,您将运行它以验证 2 月出租车数据 CSV 文件,并查看该文件是否通过了您之前创建的预期。首先,返回您的终端并停止 Jupyter 笔记本,如果它仍在运行,请按CTRL+C。以下命令将启动工作流以创建一个名为my_checkpoint的新检查点:

great_expectations --v3-api checkpoint new my_checkpoint

这将打开一个 Jupyter 笔记本,其中包含一些预填充的代码来配置检查点。笔记本中的第二个代码单元将从您现有的数据源中预填充一个随机data_asset_name,这将是您之前看到的data目录中的两个 CSV 文件之一。确保data_asset_nameyellow_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 Suitemy_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 月份的出租车行程数据突然引入了意外值0passenger_counts列中的一样,这似乎是一个潜在的数据错误。通过运行检查点,您使用 Expectation Suite 验证了新数据并检测到此问题。

请注意,每次在最后一个笔记本单元格中执行run_checkpoint方法时,都会启动另一个验证运行。在生产数据管道环境中,每当您处理一批新数据时,您将在笔记本之外调用run_checkpoint命令,以确保新数据通过所有验证。

结论

在本文中,您为数据验证创建了 Great Expectations 框架的第一个本地部署。您初始化了一个 Great Expectations 数据上下文,创建了一个新的基于文件的数据源,并使用内置分析器自动生成了一个 Expectation Suite。然后,您创建了一个检查点来对一批新数据运行验证,并检查数据文档以查看验证结果。

本教程只教你远大前程的基础知识。该包包含更多用于配置数据源以连接到其他类型的数据的选项,例如关系数据库。它还带有一个强大的机制,可以根据表名或文件名中的模式匹配自动识别新批次的数据,这允许您只配置一次检查点来验证任何未来的数据输入。您可以在官方文档中了解更多关于远大前程的信息。

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐