Expectations
: 데이터에 대한 검증 가능한 주장Automated data profiling
: 자동화된 데이터 프로파일링 제공Data validation
: Expectations를 생성하고 나면 Great Expectations는 임의의 배치 또는 여러 데이터 배치를 로드하여 데이터를 검증할 수 있음Data Docs
: Great Expectations는 사람이 읽을 수 있는 HTML 데이터 문서를 반환Support for various Datasources and Store backends
$ pip install great_expectations
저자가 느끼기에도 굉장히 복잡한 편이며 용어나 제공되는 API 가 굉장히 많다, 이런 전반적인 개념은 실제로 구축하면서 추가로 살펴보도록 하고 이 포스팅에서는 제공하는 튜토리얼 내용에 집중해서 기본적인 개념만 다루도록 하겠다.
Data Context
가 프로젝트 구성을 관리한다
great_expectations init
를 실행 (git init 과 비슷)$ great_expectations init
Great Expectations will create a new directory with the following structure:
great_expectations
|-- great_expectations.yml # 배포의 기본 구성
|-- expectations # 모든 Expectation의 Json 파일
|-- checkpoints
|-- plugins # 배포의 일부로 개발하는 사용자들의 커스텀 플러그인
|-- .gitignore
|-- uncommitted # 버전 컨트롤에 있어서는 안되는 파일들
|-- config_variables.yml # 데이터베이스 credentials 과 같은 민감한 정보
|-- data_docs # Expectations, Validation Result, 기타 메타데이터에서 생성된 data docs
|-- validation # great expectations 에 의해 생성된 검증 결과 보유
Datasource
는 데이터 참조를 위한 일관된 cross-platform API 를 관리하고 제공한다
great_expectations datasource new
를 실행
$ great_expectations datasource new
What 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
여기서 헷갈릴 수 있는 점은 위의 입력이 끝났다고 실제 Datasource
가 생성되는건 아니라는 것이다. 입력이 끝나면 위에서 정의한 Datasource 를 생성하기위한 몇 가지 상용구 코드가 포함된 jupyter notebook이 열린다.
great_expectaions.yml
에서 생성된 Datasource를 확인/편집할 수 있다.datasources:
getting_started_datasource:
class_name: Datasource
execution_engine:
module_name: great_expectations.execution_engine
class_name: PandasExecutionEngine
module_name: great_expectations.datasource
data_connectors:
default_inferred_data_connector_name:
class_name: InferredAssetFilesystemDataConnector
default_regex:
group_names:
- data_asset_name
pattern: (.*)
module_name: great_expectations.datasource.data_connector
base_directory: ../data
default_runtime_data_connector_name:
class_name: RuntimeDataConnector
assets:
my_runtime_asset_name:
class_name: Asset
batch_identifiers:
- runtime_batch_identifier_name
module_name: great_expectations.datasource.data_connector.asset
module_name: great_expectations.datasource.data_connector
Expectations
는 Great Expectations의 핵심 개념이다
great_expectations suite new
를 실행Expectation Suite
란 Expectation의 모음이다$ great_expectations suite new
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 "default_inferred_data_connector_name") would you like to use?
1. yellow_tripdata_sample_2019-01.csv
2. yellow_tripdata_sample_2019-02.csv
: 1
여기까지 진행했다면 Expectation Suite 의 이름을 작성하면된다. 여기서는 test.demo
라 하겠다.
Name the new Expectation Suite [yellow_tripdata_2019-01.csv.warning]: test.demo
그럼 아래와 같이 몇가지 상용구 코드가 포함된 jupyter notebook 이 생성된다.
이제 데이터를 프로파일링하여 생성한 Expectation Suite를 초기화하는 작업이 필요하다. 본 섹션에서는 실행된 Notebook 파일의 구성을 살펴보고 마지막으로 생성한 데이터 문서 (Data Docs)를 살펴보도록 하겠다.
Expectation Suite를 생성하여 실행되는 Notebook 파일은 총 네 개의 코드 셀로 구성이 되어있다. 첫 번째 셀은 관련한 라이브러리를 임포트하고, Data Context를 불러온 다음 데이터 검증을 위한 Validator
를 생성하는 내용을 포함하고 있다.
두 번째 셀은 데이터를 프로파일링할 때 무시할 컬럼들의 목록을 포함하고 있다. 기존 Notebook 파일에는 전체 컬럼으로 되어 있는데 필요에 따라 프로파일링할 컬럼들을 주석 처리하면 된다. 본 포스팅에서는 컬럼들 중 passenger_count
, trip_distance
,payment_type
,fare_amount
를 주석 처리해준다.
세 번째 셀은 사용자 설정 프로파일러 설정을 할 수 있다. 처음 프로파일러를 생성할 때는 별도로 설정할 값은 없다.
마지막 네 번째 셀은 Expectation Suite
를 디스크에 저장하고 불러온 데이터 배치에 대해 검증을 수행한다. 그리고 데이터 문서를 실행시켜 주는데 여기서 검증 결과를 확인할 수 있다. 이 셀을 실행하면 지금까지의 설정을 바탕으로 작성된 데이터 문서를 확인할 수 있다.
데이터 문서는 다음과 같이 생겼다.
데이터 문서를 살펴보면 여러 Expectation을 다루고 있다. 프로파일러를 통해 Expectation을 얻게 되면 기본적으로 다음과 같은 정보들을 얻게 된다.
하지만 중앙값이 정확히 얼마가 나와야 한다던가, 데이터의 행 갯수가 정확히 몇 개여야 한다던가하는 불필요한 Expectations은 삭제하거나 수정할 필요가 있다. Expectation Suite를 수정하기 위해선 다음 명령어를 실행해야한다.
$ great_expectations suite edit test.demo
그러면 Expectation Suite를 어떤 방법으로 수정할건지 물어보는 메시지가 출력되는데 본 포스팅에서는 1번을 선택했다.
Using v3 (Batch Request) API
How would you like to edit your Expectation Suite?
1. Manually, without interacting with a sample batch of data (default)
2. Interactively, with a sample batch of data
: 1
그러면 edit_test.demo.ipynb
라는 notebook 파일이 하나 실행되는데 이 파일을 이용해서 Expectation Suite를 수정하면 된다. 기존에 존재하는 Expectation들을 삭제하기 위해서는 첫 셀의 내용을 조금 수정해야 한다.
이 셀에서 맨 밑에 있는 try-except
문에서 except
부분만 사용해야한다. 그리고 다음과 같이 overwrite_existing=True
를 추가한다.
그 이후 필요에 따라서 셀을 추가/수정하거나 삭제하면 된다.
수정이 끝나면 모든 셀을 처음부터 끝까지 실행해준다. 그러면 데이터 문서가 다시 실행되고 올바르게 수정된 것을 확인할 수 있다.
great_expectations/expectations/test/demo.json
에서 JSON 파일로 Expectations Suite 를 확인할 수 있다.
{
"data_asset_type": null,
"expectation_suite_name": "test.demo",
"expectations": [
{
"expectation_type": "expect_table_columns_to_match_ordered_list",
"kwargs": {
"column_list": [
"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"
]
},
"meta": {}
},
{
"expectation_type": "expect_column_values_to_not_be_null",
"kwargs": {
"column": "passenger_count"
},
"meta": {}
},
..
]
"ge_cloud_id": null,
"meta": {
"great_expectations_version": "0.15.14"
}
}
이제 마지막으로 데이터를 검증하는 일만 남았습니다. 여기서는 Checkpoint
사용한다.
우선 터미널에서 아래 명령어를 입력하여 Checkpoint 를 생성한다.
$ great_expectations checkpoint new test_checkpoint
두번째 셀을 보면 검증 데이터가 yellow_tripdata_sample_2019-02.csv
로 생성된 것을 확인할 수 있다. 검증에 사용할 Expectation Suite 는 test.demo
로 설정되어있다.
마지막 셀에 주석 처리되어있는 라인을 해제하여 Checkpoint 를 실행한다.
정상적으로 테스트가 통과한걸 확인할 수 있다.
간략하게 튜토리얼을 통해 Great Expectations 의 전반적인 흐름을 살펴봤다.
다음 포스팅에서는 프로덕션 환경에서 Great Expectatios를 pyspark 을 이용하여 연동하는 방법을 살펴보겠다.
잘봤습니다.