본문 바로가기
Spark

[Spark] JSON string 파싱하기

by 초이MS 2021. 8. 26.

목적

  • spark에서 json data source를 이용할 경우 json이 newline으로 구분되어있어야 json이 제대로 인식된다.
  • 필자가 이용하는 데이터의 경우 아래와 같이 newline이 제대로 입력되어있지 않았다.
  • {"a":"b"}{"a":"c"}{"a":"d"}{"b":"e"}...
  • 이럴 때에 써먹을만한 간단한 파이썬 함수를 기록한다.

내용

import re
import json

def json_splitter(input_json):
    r = re.split('(\{.*?\})(?= *\{)', input_json)
    
    accumulator = ''
    res = []
    
    for subs in r:
        accumulator += subs
        try:
            json_dict = json.loads(accumulator)
            json_str = json.dumps(json_dict)
            res.append(json_str)
            accumulator = ''
        except:
            pass
        
    return res
  • 우선 정규식으로 {혹은 }로 감싸져있는 부분들을 나눈다.
  • 만약 해당 값이 json.loads로 읽히면, 즉 json이라면 이를 res에 저장한다.
  • 그렇지 않다면 다음 토큰까지 accumulator에 저장해서 json인지 아닌지 확인한다.

테스트 결과

  • 간단한 테스트의 경우는 아래와 같이 결과가 잘 나왔다. 이를 udf를 이용해 활용할 수 있다.
test_json="""
{"a":["1","2","3"], "b":"hey"}{"this":"is","my":123}{"test":"json"}
"""
json_splitter(test_json)
>> [{'a': ['1', '2', '3'], 'b': 'hey'}, {'this': 'is', 'my': 123}, {'test': 'json'}]

참고

- https://stackoverflow.com/questions/36967236/parse-multiple-json-objects-that-are-in-one-line/43807246

반응형

댓글