brunch

You can make anything
by writing

C.S.Lewis

by 이민우 Dec 29. 2017

아름답다. Dataprep

Data Preparation + Cleansing

# 숫자를 확인할 때 힘든 점


쌓아둔 정보를 

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

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


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

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

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

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


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

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

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

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


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

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

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




# Dataprep..?


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

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

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

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


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

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

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

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




# 켜는 방법


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

준비되었으면,


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


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

약관 동의
Trifacta에게 접근 허가
한번 더 접근 허가.


3. 저장소 경로 지정


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

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


이것으로 준비는 끝난다.




# 메뉴


3개의 메뉴가 제공된다.

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

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

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




# 예시


## Dataset, Import


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

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



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



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

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




## Flow, Recipe


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

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


가져온 데이터가 보인다. 선택한다.
Flow에 데이터가 들어간 상태


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

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



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

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


잠시 대기한다.
로딩이 끝난 후에 보이는 모습


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

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

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

예를 들어..

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

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

...

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

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



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

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

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

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


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



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

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



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


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

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



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

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

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



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



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


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

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

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

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



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



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

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

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




## JOBS, Run


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

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

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

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


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



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

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




## Dataflow


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

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


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



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



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

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

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




## JOBS, Export Results


다시 Dataprep로 넘어와보면, 



작업이 완료되었다!

"View Results"를 눌러보면..



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

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



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

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




## FLOWS, Schedule


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

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

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


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

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



일정을 설정하고 나면 

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


이전에 했던 설정과 같다.


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


대략 여기까지가 기본적인 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 만큼은 꼭 챙겨가겠다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari