-
Glue에서 mySQL로 write시 encoding option 주기 (feat. 한글깨짐)Data Engineering/AWS, Spark 2023. 5. 10. 18:06728x90반응형
Glue에서 from_jdbc_conf를 통해 dynamicFrame을 insert시켰는데 DB의 기본 인코딩 세팅때문에 한글이 깨져서 인서트되는 문제가 발생했다 (5.7 이하 버전)
pymysql의 connection메소드에는 이를 위해 charset이라는 옵션이 있는데,
from_jdbc_conf
에는 인코딩 옵션이 없어 찾아보니 인코딩 옵션을 jdbc url의 파라미터로 넘겨줄 수 있었다.처음에 확인했던 문서에는 인코딩 옵션을 넘겨주는 파라미터 이름이 characterEncoding이라고 되어있어 그렇게 넘겨줬더니
An error occurred while calling o111.pyWriteDynamicFrame. Unsupported character encoding 'utf8?useCursorFetch=true'
라는 에러 메세지가 발생했다.추가적으로 서칭을 해보니 서버 연결 옵션이 charaterEncoding에서 character_set_server로 바뀌었다고 한다.
결론적으로 다음과 같이 jdbc url을
connection_options의
파라미터로 넘겨주면 한글이 깨지지 않고 들어가는 것을 확인할 수 있다.jdbc:mysql://<mysql host 주소>:/?useUnicode=true&character_set_server=utf8mb4
...고 하는데 나는 위 같이 설정했는데도 안됐다. 심지어 char_set_server외에도 char_set_connection, character_set_client 등 다른 옵션들을 함께 넘겨 봤는데도 안됐다. 이유도 안나와서 rePost에 올리긴 했는데 Glue에서 해당 파라미터를 지원하지 않는게 아닐까싶다.
방법은 찾아야해서 spark session을 통해 데이터를 insert하는 방법으로 우회했다. spark session은 option을 통해 encoding 값을 넘겨줄 수 있다. 대신 dynamicFrame을 dataFrame으로 변환하는 과정이 필요하다.
source_df = source_dyf.toDF() source_df.write\ .format("jdbc")\ .option("url", "mySQL jdbc url")\ .option("dbtable", "target table name")\ .option("user", "user name")\ .option("password", "password")\ .mode("overwrite")\ .option("truncate", "true")\ .option("encoding","UTF-8")\ .option("characterEncoding","UTF-8")\ .option("useUnicode","true")\ .save() job.commit()
(기타) utf-8과 utf8mb4의 차이
utf8mb4는 mySQL과 MariaDB에서 utf8과 동일하게 동작한다. 만약 mySQL에서 utf8로 인코딩 할 경우 이모티콘 문자가 입력되지 않는다. 그 이유는 utf8는 4바이트 가변길이 인코딩 방식이라 일반 문자열은 3바이트 이내에서 (영문은 1바이트, 한글은 3바이트), 이모티콘은 4바이트로 인코딩한다. 하지만 mySQL의 utf8 문자셋은 4바이트 인코딩을 지원하지 않기 때문이다.
(추가) dynamicFrame을 쓸 수있는 또 다른 방법을 찾아서 추가 포스팅
728x90반응형'Data Engineering > AWS, Spark' 카테고리의 다른 글
Glue에서 mySQL로 write시 encoding option주기 (feat. 한글깨짐) - 2부 (0) 2023.05.15 RDS MySQL DB 트랜잭션 binary log 보기 (0) 2023.05.11 Lamda로 서로 다른 vpc에 있는 redshift에서 rds로 reverse ETL하기 (VPC peering) (0) 2023.05.09 Comparing AWS messaging service - SNS vs SQS (AWS SNS vs SQS 비교, Slack 메세지 보내기 적합한 파이프라인 선택하기) (0) 2023.01.18 Glue Spark UI 서버 띄워서 Job 상세 실행 내역 확인하기 (0) 2023.01.06