목적
- parquet의 경우, attribute name에 " ,;{}()\n\t=" 문자가 들어가면 rename을 시켜주어야한다. 에러메시지는 아래와 같다.
'Attribute name "my column" contains invalid character(s) among " ,;{}()\\n\\t=". Please use alias to rename it.;' ... pyspark.sql.utils.AnalysisException: 'Attribute name "some-ar ray" contains invalid character(s) among " ,;{}()\\n\\t=". Please use alias to rename it.;'
- json을 parquet로 저장 시 key값에 해당 문자들이 들어가 데이터가 저장이 제대로 되지 않는 문제가 있었다.
- 해당 문제 해결 방법을 기록한다.
과정
- json 데이터를 textFile로 읽는다.
- 정규식, 재귀를 이용해서 key에 해당 문자가 들어갔다면 다른 문자로 치환하거나 삭제한다. 필자는 underscore(_)를 이용하였다.
- 코드는 아래와 같다.
import re, json
def remove_special_char(input_str):
return re.sub('[ ,;\{\}\(\)\n\t=]','_',input_str)
def traverse_json_recursively(current_dict):
for key, value in current_dict.items():
if type(value) is dict:
traverse_json_recursively(current_dict.get(key))
elif type(value) is list:
for element in value:
traverse_json_recursively(element)
new_key = remove_special_char(key)
current_dict[new_key] = current_dict.pop(key)
return current_dict
...
rdd = spark.sparkContext.textFile(${json_data_path})
df = spark.read.json(rdd.map(lambda x: json.dumps(traverse_json_recursively(json.loads(x))))
...
반응형
'기타' 카테고리의 다른 글
[AWS] python으로 s3에 있는 parquet 파일 읽기 (0) | 2022.02.03 |
---|---|
[Hadoop] HDFS에서 S3로 Distcp (0) | 2022.01.17 |
[Spark] json -> parquet로 저장시 스키마 충돌 문제 해결 (0) | 2021.10.06 |
[Postgresql] 테이블 DDL 확인하기 (0) | 2021.09.14 |
[Postgresql] Postgresql13 rpm으로 설치 (0) | 2021.08.27 |