Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Spark JDBC

ClickHouse 지원

JDBC는 Spark에서 가장 널리 사용되는 데이터 소스 중 하나입니다. 이 섹션에서는 Spark와 함께 ClickHouse official JDBC 커넥터를 사용하는 방법을 자세히 설명합니다.

데이터 읽기

public static void main(String[] args) {
        // Spark 세션 초기화
        SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate();

        String jdbcURL = "jdbc:ch://localhost:8123/default";
        String query = "select * from example_table where id > 2";

        //---------------------------------------------------------------------------------------------------
        // jdbc 메서드를 사용해 ClickHouse에서 테이블 로드
        //---------------------------------------------------------------------------------------------------
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("user", "default");
        jdbcProperties.put("password", "123456");

        Dataset<Row> df1 = spark.read().jdbc(jdbcURL, String.format("(%s)", query), jdbcProperties);

        df1.show();

        //---------------------------------------------------------------------------------------------------
        // load 메서드를 사용해 ClickHouse에서 테이블 로드
        //---------------------------------------------------------------------------------------------------
        Dataset<Row> df2 = spark.read()
                .format("jdbc")
                .option("url", jdbcURL)
                .option("user", "default")
                .option("password", "123456")
                .option("query", query)
                .load();

        df2.show();

        // Spark 세션 중지
        spark.stop();
    }

데이터 쓰기

 public static void main(String[] args) {
        // Spark session을 초기화합니다
        SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate();

        // JDBC 연결 정보를 설정합니다
        String jdbcUrl = "jdbc:ch://localhost:8123/default";
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("user", "default");
        jdbcProperties.put("password", "123456");

        // 예시용 DataFrame을 생성합니다
        StructType schema = new StructType(new StructField[]{
                DataTypes.createStructField("id", DataTypes.IntegerType, false),
                DataTypes.createStructField("name", DataTypes.StringType, false)
        });

        List<Row> rows = new ArrayList<Row>();
        rows.add(RowFactory.create(1, "John"));
        rows.add(RowFactory.create(2, "Doe"));

        Dataset<Row> df = spark.createDataFrame(rows, schema);

        //---------------------------------------------------------------------------------------------------
        // jdbc 메서드를 사용해 df를 ClickHouse에 저장합니다
        //---------------------------------------------------------------------------------------------------

        df.write()
                .mode(SaveMode.Append)
                .jdbc(jdbcUrl, "example_table", jdbcProperties);

        //---------------------------------------------------------------------------------------------------
        // save 메서드를 사용해 df를 ClickHouse에 저장합니다
        //---------------------------------------------------------------------------------------------------

        df.write()
                .format("jdbc")
                .mode("append")
                .option("url", jdbcUrl)
                .option("dbtable", "example_table")
                .option("user", "default")
                .option("password", "123456")
                .save();

        // Spark session을 중지합니다
        spark.stop();
    }

병렬성

Spark JDBC를 사용할 때 Spark는 단일 파티션으로 데이터를 읽습니다. 더 높은 동시성을 확보하려면 partitionColumn, lowerBound, upperBound, numPartitions를 지정해야 합니다. 이 값들은 여러 워커가 병렬로 읽을 때 테이블을 어떻게 파티션할지 정의합니다. 자세한 내용은 Apache Spark 공식 문서의 JDBC 구성을 참조하십시오.

JDBC 제한 사항

  • Spark JDBC는 ClickHouse 방언이 없기 때문에 복합 타입(MAP, ARRAY, STRUCT)을 지원하지 않습니다. 복합 타입을 완전히 지원하려면 네이티브 Spark-ClickHouse 커넥터를 사용하십시오.
  • 현재 JDBC를 사용하면 기존 테이블에만 데이터를 삽입할 수 있습니다(현재는 Spark가 다른 커넥터에서처럼 DF 삽입 시 테이블을 자동으로 생성할 방법이 없습니다).
Navigation