본문 바로가기
학습장/Data Engineering

spark 에서 jdbc 활용하여 RDB로 데이터 적재

by daedoo_ 2021. 4. 27.

2021.04.05 - [학습장/Hadoop] - vertica-spark 연동

 

vertica-spark 연동

Vertica와 pyspark 연동을 위해 버티카쪽에서 필요한 설정 1. VERIFY_HADOOP_CONF_DIR 연동하고자 하는 hadoop의 core-site.xml, hdfs-site.xml 파일을 버티카 전체 노드마다 /etc/hadoop/conf 에 위치시킴. 아래..

ourhistory160109.tistory.com

vertica-pyspark 커넥터 활용한 vertica와 pyspark 간 load(), save() 통한 연동에 관한 포스팅에 이어 jdbc 활용하여 pyspark Dataframe을 RDB 테이블에 적재하는 방법에 대해 포스팅하고자 합니다.

 

ex) save to Vertica

df.write  \
  .format("jdbc")  \
  .mode("append")  \
  .option("url","jdbc:vertica://host:port/dbname")  \
  .option("user", "DBUSER")  \
  .option("password", "USER_PASSWORD")  \
  .option("dbtable", "tableName")  \
  .option("driver","com.vertica.jdbc.Driver")  \
  .save()

mode - overwrite, append, ignore, error

Spark implicitly converts StringType to Text, Datatype which is not supported by Vertica

참고 - akashrehan.wordpress.com/2018/01/22/spark-dialect-for-datatype-conversion/

 

Spark JDBC Dialects for Datatype conversion

Spark SQL includes a data source that can read data from other databases using JDBC. This functionality should be preferred over using JdbcRDD. This is because the results are returned as a DataFra…

akashrehan.wordpress.com

 

overwrite 시에는 spark 에서 dataframe의 컬럼명, 타입에 따라 타겟DB에 테이블을 DROP 후 재생성하는데, dataframe에서 String인 경우 DB상의 해당 컬럼은 TEXT 타입으로 생성해버림. 버티카와 같이 TEXT 타입을 지원하지 않는 DB의 경우 테이블 생성 단계에서 에러 발생.

[Vertica][VJDBC](5108) ERROR: Type "TEXT" does not exist

 

이런 경우에 dataframe 에서의 String 컬럼은 varchar 타입으로 미리 타겟 테이블을 생성해두고 mode='append' 로 수행해보니 정상 동작함. 

다만, 위 구문 만으로는 타겟 테이블에서 중복 방지를 위해 적재 전에 삭제 할 수가 없어서, 해당 DB와 연동 되는 python 패키지 등을 활용해서 쿼리로 write() 전에 별도 삭제 필요함.

 

spark-vertica 커넥터 활용한 save()는 vertica가 클라이언트로서 HDFS에 접근하여 *.orc 파일을 테이블로 적재하는 반면, 위 처럼 jdbc 활용한 방법은 spark -> vertica 방향으로 적재가 이루어 지는 것으로 보임. (어떤 방법이 더 유리하려나..?)

댓글