[Python] 데이터 포맷 변환 - Protocol Buffer를 Json으로 변환

2021. 4. 27. 18:52 Python/Python 프로그래밍

들어가며

  데이터 포맷은 참... 다양합니다. 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단계로 이루어져 있습니다. 

  1. 첫번째는 내가 정의한 protocol buffer의 파일을 읽기
  2. 읽어드린 파일을 protobuf_to_dict을 이용해 dict의 형태로 변환을 하고, dict의 데이터를 json으로 변경
  3. json_string의 값을 파일에 저장
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"))

 

출처 : ourcstory.tistory.com/164?category=630693