반응형
들어가며
데이터 포맷은 참... 다양합니다. json부터 시작해서 csv, protocol buffer, text 등등.. 이번에는 protocol buffer를 json의 형태로 변환하는 방법에 대해서 알아보려고 합니다. 왜 필요하느냐.. 저 같은 경우에는 spark에서 데이터를 처리하기 위해서 변환을 했습니다. 사실 스파크에서는 protocol buffer를 지원하기 때문에 그대로 읽으면 되지만, tweeter에서 제공하는 elephant-bird 라이브러리를 함께 사용해야 하는 복잡함이 있다. 그것보다 아직 protocol buffer를 읽어서 spark에서 처리한 내용이 거의 없었다. 내가 찾아봤을때는 elephant-bird와 scala를 이용해서 읽어보려고 했으나 많은 dependency 등과 그 외의 문제가 엄청 많았다. 많은 커뮤니티에서 다루고 있는 문제라면 쉽게 해결을 할 수 있겠지만, 그래서 일단 숙제로 남겨두고 급한대로 protocol buffer를 json으로 변환한 뒤에 스파크에서 처리하자라는 생각으로 작전을 변경했다. 일단 처리는 해야하니까 말이다. 다음에는 꼭 해결하리.
라이브러리 설치
protobuf를 dict의 형태로 변환을 해주는 라이브러리가 존재해서 사용을 하였다. [바로가기]
$ sudo pip install protobuf-to-dict
소스코드
소스코드는 총 3단계로 이루어져 있습니다.
- 첫번째는 내가 정의한 protocol buffer의 파일을 읽기
- 읽어드린 파일을 protobuf_to_dict을 이용해 dict의 형태로 변환을 하고, dict의 데이터를 json으로 변경
- json_string의 값을 파일에 저장
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json, os | |
import Proto import Tweet_pb2 as LogDataProto | |
import protobuf_to_dict import protobuf_to_dict | |
filename="tweet.log" # proto type | |
# read protobuf file | |
f = open(filename, "r") | |
try: | |
logfile = LogDataProto.LogDataFile() | |
logfile.ParseFromString(f.read()) | |
except (IndexError, TypeError): | |
print 'index, type error' | |
# protobuf to json | |
logfile_dict = protobuf_to_dict(logfile) | |
json_string = json.dumps(logfile_dict, encoding='utf-8') | |
# write json file | |
new_filename = os.path.splitext(filename)[0] + '.json' | |
f = open(new_filename, 'w') | |
f.write(json_string.encode("utf-8")) |
반응형
'Programming > Python' 카테고리의 다른 글
[Python] Singleton Pattern을 이용한 Logger 만들기 (3) | 2016.08.11 |
---|---|
[Python] 파이썬 CSV파일 입/출력 (FileI/O) (4) | 2016.08.11 |
[Python] Enum 사용하는 방법 및 예제코드 (0) | 2016.05.31 |
[Python] collections를 이용한 Dictionary 정렬하기 (0) | 2016.05.25 |
[Python] json 모듈 사용하기 :: String을 Dict으로 변환 (0) | 2016.05.25 |