brunch

아름답다. Dataprep

Data Preparation + Cleansing

by 이민우

# 숫자를 확인할 때 힘든 점


쌓아둔 정보를

원하는 대로 골라보는 방법이 꽤 까다롭다는 점,

원하는 대로 정제하는 방법도 까다롭다는 것이 힘들다.


쿼리를 잘 짜거나 코드를 잘 짜면 해결...이지만

쿼리로 짜면 가독성이 지나치게 떨어져 재활용이나 협업이 힘들고

코드로 짜면 챙겨야 할 준비물도 많고 적어야 할 문장도 긴 편이라 시간이 많이 필요하다.

모두 잘 짜는 것이 가능하다고 해도.. 아니 그것은 나와 관계없으니 전제로 하는 얘기는 필요 없겠고.


숫자 보고 확인해야 할 사람이

원하는 대로, 필요한 규격으로 맞춰 잘라내는 이 과정을 해내기에는 꽤 부담이 되는 일이라서

결국에는 반복적이고 지속적으로 남의 손을 빌리게 되는 상황이 되고.

그래서 엔지니어와 분석가 서로 전문적으로 각각의 영역에서 일하게 되는데..


엔지니어도 분석가도 아니지만 그렇다고 숫자를 보지 않을 수도 없는 입장에서

쿼리를 짜는 것도 코드를 짜는 것도 굉장한 무리가 있다.

하루 종일 쿼리를 짜거나 하루 종일 코드를 짜고 있노라면 굉장한 비효율을 감내해주는 현 직장에 대한 감사의 마음이 떠오르는데..




# Dataprep..?


Trifacta와의 협업으로 구글 클라우드에 올려진 Dataprep은 아직 베타 딱지를 단 상태로

퍼블릭 베타가 된 것이 2017년 9월, 11월에 업데이트가 한번 있었던 꽤 신생아스러운 서비스이다.

소개 페이지의 제목을 보면..

분석을 위해 데이터를 시각적으로 탐색, 정리, 준비하는
지능형 클라우드 데이터 서비스


쓸데없는 장식을 빼내고 정리해보면 대략 "시각적 데이터 조회 및 정리용 도구" 쯤이 되는 듯하다.

screencapture-clouddataprep-jobs-8651-1514437647077.png 모아둔 데이터가 어떻게 생겼는지 한 눈에 파악하기 쉬운 그림을 그려준다.
실제 데이터를 가지고 전/후를 비교해가며 정리할 수 있어 이해가 쉽다.

그림에서 보듯이, Dataprep은 복잡한 쿼리나 코드 없이 간단하게 동작하며

험난한 러닝 커브 없이 수월하게 시작할 수 있다.




# 켜는 방법


사전 준비물. 우선 구글 클라우드 계정과 프로젝트가 필요하다.

준비되었으면,


1. 메뉴 제일 하단, Dataprep 클릭

console.cloud.google.com__pli=1.png


2. Trifacta와의 협업이 느껴지는 약관과 권한 부여에 동의

console.cloud.google.com__pli=1 (1).png 약관 동의
console.cloud.google.com_dataprep (1).png Trifacta에게 접근 허가
accounts.google.com_signin_oauth_consent_authuser=0&part=AJi8hAP7r2z9e7hdd6S4O2AeOLZ1vxMOckjd_uX_iov6rd3zEh6gFTvX7ViCY1V0HOpJYUS48YjT7NCnHkUrsrbWPQstlKbSKnknWxYt1-sVMl_plmz_r_xuuemc4vrLhghC8tY5VMOJajWecI9HJ3ZjNr7NGeMGLwf.png 한번 더 접근 허가.


3. 저장소 경로 지정

clouddataprep.com_setUp_storageLocation_url=%2F.png


대충 알아서 지정해주고 생성해주니 확인과 동의, 다음 버튼만 누르면 끝난다.

이 과정이 끝나면 아래와 같은 화면이 나온다.


clouddataprep.com_flows (1).png

이것으로 준비는 끝난다.




# 메뉴


3개의 메뉴가 제공된다.

1. FLOWS : 데이터 정리 과정을 관리한다.

2. DATASETS : 데이터를 가져와 지정해둔다.

3. JOBS : Flows에서 실행한 정리 작업들이 보관된다.




# 예시


## Dataset, Import


우선 가장 먼저 해야 할 일은 데이터를 가져오는 것.

DATASETS > Import Data를 누르면 아래와 같은 화면이 나온다.


clouddataprep.com_flows (2).png


이후 파일 혹은 테이블을 선택하면


clouddataprep.com_flows (3).png


오른쪽에 가져올 데이터가 선택된 것이 보인다.

데이터를 가져오는 방법은 단순히 선택하는 것으로 끝난다.




## Flow, Recipe


데이터를 가져왔으니 본격적으로 Flow에 태워준다.

"Add datasets" 버튼을 눌러 데이터를 Flow에 넣어준다.


clouddataprep.com_flows (5).png 가져온 데이터가 보인다. 선택한다.
clouddataprep.com_flows (6).png Flow에 데이터가 들어간 상태


Flow에 데이터가 올라갔으니 이제 자르고 더할 시간이다.

"Add new Recipe" 버튼을 눌러 다음으로 진행한다.


clouddataprep.com_flows (7).png


데이터 소스 옆에 레시피 문서와 테이블이 하나씩 생겨난다.

"Edit Recipe" 버튼을 눌러 다음으로 진행한다.


clouddataprep.com_flows (8).png 잠시 대기한다.
clouddataprep.com_data_34530_103330.png 로딩이 끝난 후에 보이는 모습


여기가 Dataprep의 중심이자 전부인 곳이다.

컬럼 이름과 각 컬럼의 데이터 구성을 히스토그램으로 보여주는 차트들이 보이고

실제 데이터가 그 밑으로 보인다.

예를 들어..

2017-12-28_161031.png

첫 번째 컬럼 "vendor_id" 에는 데이터가 1 혹은 2로 구성되어 있고, 1이 620개, 전체의 47.51%라고 한다.

이제 잘 들어간 것을 확인했으니 데이터가 어떻게 생겼는지, 어떻게 정리할지 견적을 내본다.

...

문득 vendor_id에서 2인 경우는 필요 없다는 생각이 든다.

2를 마우스 드래그 혹은 더블클릭해보면..


clouddataprep.com_data_34530_103330 (1).png


비슷한 이름의 컬럼이 하나 더 늘어난 것이 보인다.

파란색은 원본, 주황색은 수정 후의 데이터를 보여주는 곳이고

오른쪽의 메뉴에서는 데이터를 정리할 방법들이 여러 가지 제안되고 있다.

제안된 여러 방법 중 "Delete rows"를 찾아 "with values matching `2`"를 누르면..


clouddataprep.com_data_34530_103330 (2).png

2가 모두 빨갛게 표시된다.


clouddataprep.com_data_34530_1033301(2).png


자세히 보면 각 컬럼 별로 지워지는 Row가 차지하는 비율도 얼마나 되는지 바로 확인된다.

여기서 "Add" 버튼을 누르면.


clouddataprep.com_data_34530_103330 (3).png


방금 설정한 "vendor_id가 2인 Row를 지우는 단계"가 레시피에 추가되었다.


위와 같이 제안된 방법 중 하나를 골라 사용하는 것 외에 직접 함수를 호출하는 방법도 있다.

우측 하단의 "+" 버튼을 눌러서..


2017-12-28_165920.png


몇 가지 함수들이 제공되는 것이 보인다.

데이터를 넣을 때는 생각하지 못했는데 얼핏 보니 필요 없는 컬럼이 있는 것 같다.

아래와 같이 "drop"을 선택하고 지울 컬럼의 이름을 적어준다.


clouddataprep.com_data_34530_103330 (2).png


잘 설정된 것 같으니 "Add" 버튼을 눌러주면..


clouddataprep.com_data_34530_103330 (3).png


두 번째 단계가 레시피에 성공적으로 들어갔다.


잠깐, 그런데 만들어놓은 레시피에서 빠진 것이 생각났다.

두 번째 단계에서 지웠던 컬럼이 다 쓸모없는 값이 아니라 약간 고치면 쓸만할 것 같다.

이 경우 레시피를 지우고 다시 만들 필요 없이

이전 단계를 선택한 후 "New Step"를 눌러서..


clouddataprep.com_data_34530_103330 (5).png


원하는 값으로 변경해주고 새로운 컬럼으로 저장한다.


clouddataprep.com_data_34530_103330 (6).png


레시피 중간에 새로 만든 단계가 추가된 것이 보인다.

원하는 그림이 나왔다고 생각되면..

우측 상단의 "Run Job"을 눌러 다음으로 진행한다.




## JOBS, Run


여기까지가 사람의 일이었고, 지금부터는 서비스가 작업해주는 영역이다.

작업이 실행되고 나면 결과물을 CSV 파일에 담아 GCS에 저장하는 것이 기본 설정이고

빅쿼리에 저장할 수도 있다.

파일 저장 시마다 [새로운 이름의 다른 파일로 저장, 기존 파일에 추가, 기존 파일 대체] 가 가능하다.


clouddataprep.com_data_34530_103330 (7).png
clouddataprep.com_data_34530_103330 (7).png

"Run Job"을 눌러 실행해보면..


clouddataprep.com_data_34530_103330 (9).png


위와 같이 Job이 하나 생겨나 실행되기 시작한다.

마냥 기다리면 알아서 잘 돌려주고 잘 저장해준다.




## Dataflow


갑자기 뜬금없지만 사실 Dataprep가 실제로 작업을 하는 곳은 Dataflow다.

Job에서 옵션 아이콘을 눌러 "Cloud Dataflow Job"을 클릭하면..

clouddataprep.com_data_34530_103330 (10).png


아래와 같이 Dataflow Job 조회 화면으로 넘어가게 된다.


console.cloud.google.com_dataflow_jobsDetail_locations_us-central1_jobs_2017-12-28_05_13_31-4306413442957846181_project=socar-analysis.png


아까 적어두었던 레시피 그대로 작업이 설정되어 있고 실행이 진행 중임을 알 수 있다.


console.cloud.google.com_dataflow_jobsDetail_locations_us-central1_jobs_2017-12-28_05_13_31-4306413442957846181_project=socar-analysis (1).png


기다리다 보면 작업이 완료된다.

이 파이프라인 하나 짜 보려고 했던 삽질을 생각하면.. 이것은 마치 매직 같은 마법..

아... 물론 작업을 다시 실행하면 언제든 이 과정이 다시 실행되고 새 결과를 받아볼 수 있다.




## JOBS, Export Results


다시 Dataprep로 넘어와보면,


clouddataprep.com_data_34530_103330 (11).png


작업이 완료되었다!

"View Results"를 눌러보면..


clouddataprep.com_data_34530_103330 (12).png


작업 후 정리된 데이터의 형태를 볼 수 있다.

"Export Results" 버튼을 눌러보면..


clouddataprep.com_jobs_44945.png


저장소에는 이미 파일이 들어가 있다.

"Create"를 눌러주면 고 파일 고대로 다시 Dataset로 넣어준다.




## FLOWS, Schedule


이 도구를 사실 한번 작업으로 끝내기에는 참 안타까운 일인데.

아주 다행히도 스케쥴링 도구가 얼마 전 업데이트되었다.

"Add Datasets" 버튼 옆의 옵션 버튼을 누른 후 "Add Schedule..." 버튼을 눌러준다.


clouddataprep.com_flows_34530 (2).png

작업을 돌릴 시간을 정해준다.

대략 cron 돌리는 느낌과 유사하다.


clouddataprep.com_flows_34530.png


일정을 설정하고 나면

이전에 Job의 저장소를 설정했던 것처럼 Scheduled Job이 결과물을 저장할 곳을 설정해주어야 한다.


clouddataprep.com_flows_34530 (1).png 이전에 했던 설정과 같다.


설정을 마치면 지정된 시간에 맞춰 작업이 실행된다.


대략 여기까지가 기본적인 Dataprep의 사용법이자 전부이다.

뭔가 더 있을 것 같은 느낌도 들지만 전부가 맞다.




# 제한사항


쿼리나 코드로 데이터 정리하는데 도가 튼 분들을 제외하고.

이쯤 되면 매력적인 도구로 생각될 수도 있겠지만..

베타 딱지가 아직 붙어 있는 이유가 있다.


## Datasets


- [직접 업로드, GCS, Bigquery] 만 연결할 수 있다.

- 한 번에 하나의 데이터만 넣을 수 있다.

- 지정한 이름의 테이블만 가져올 수 있다.


## Flows

- [GCS, Bigquery] 로만 결과물을 받아볼 수 있다.


말하자면..

수많은 다른 DB들 모두 소용없다.

다수 테이블을 한 번에 하나의 소스로 가져올 수도 없고 손수 하나하나 import 해줘야 한다.

Schedule Job을 만들어둬 봤자 소스가 다른 이름으로 들어오면 자동으로 붙일 방법이 없다.

즉, 현재 구현된 Schedule Job은 같은 이름의 소스에 때마다 append 해줘야 쓸 수 있다..




# 마치며


개인적으로 Firebase로 쏜 데이터를 Bigquery에서 조회하거나

MySQL 혹은 Oracle에서 데이터를 조회하는 일이 많은데..

위의 제한사항은 굉장히 치명적인 단점이다.

쓸 수가 없...지만 Dataprep에서 겪은 편리함 또한 치명적이다.


아직 Data Import 과정이 매끄럽지는 않아서

Bigquery에서 여러 테이블을 조회하는 쿼리 하나를 돌려 테이블에 저장한 후

그 테이블을 Dataprep로 가져와 돌리는 식으로 사용했지만..

쿼리로는 도저히 엄두가 안나는 작업 + Jupyter에서 Python으로 짜다가 하루가 다 가버린 작업..

.. 을 몇 십분 깨작거린 것으로 그렇게 끝냈다.


서비스의 생김새부터 감탄했고

자르고 더하는 도구 설계의 우아함과 쉬운 사용에 감동했으며

실행 과정에서 에러 없는 진행에 놀랐다.

꼭 한 번씩 사람 속을 뒤집는 다른 GCP 제품과 달리

GCP 제품 중 압도적으로 친절하고 가장 사용자 배려가 돋보이는 서비스다.

GCP 제품 중 업데이트가 가장 기다려지는 서비스다.

무인도에 남게 되면 Dataprep 만큼은 꼭 챙겨가겠다.

keyword
매거진의 이전글Kaggle 시작하기