Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Spark JDBC

Compatible avec ClickHouse

JDBC est l’une des sources de données les plus utilisées dans Spark. Dans cette section, nous expliquons comment utiliser le connecteur JDBC officiel de ClickHouse avec Spark.

Lire les données

public static void main(String[] args) {
        // Initialiser la session 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";

        //---------------------------------------------------------------------------------------------------
        // Charger la table depuis ClickHouse avec la méthode jdbc
        //---------------------------------------------------------------------------------------------------
        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();

        //---------------------------------------------------------------------------------------------------
        // Charger la table depuis ClickHouse avec la méthode load
        //---------------------------------------------------------------------------------------------------
        Dataset<Row> df2 = spark.read()
                .format("jdbc")
                .option("url", jdbcURL)
                .option("user", "default")
                .option("password", "123456")
                .option("query", query)
                .load();

        df2.show();

        // Arrêter la session Spark
        spark.stop();
    }

Écriture de données

 public static void main(String[] args) {
        // Initialize Spark session
        SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate();

        // JDBC connection details
        String jdbcUrl = "jdbc:ch://localhost:8123/default";
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("user", "default");
        jdbcProperties.put("password", "123456");

        // Create a sample 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);

        //---------------------------------------------------------------------------------------------------
        // Write the df to ClickHouse using the jdbc method
        //---------------------------------------------------------------------------------------------------

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

        //---------------------------------------------------------------------------------------------------
        // Write the df to ClickHouse using the save method
        //---------------------------------------------------------------------------------------------------

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

        // Stop the Spark session
        spark.stop();
    }

Parallélisme

Lors de l'utilisation de Spark JDBC, Spark lit les données à l'aide d'une seule partition. Pour obtenir davantage de parallélisme, vous devez spécifier partitionColumn, lowerBound, upperBound et numPartitions, qui définissent comment partitionner la table lors de la lecture en parallèle depuis plusieurs workers. Veuillez consulter la documentation officielle d'Apache Spark pour plus d'informations sur les configurations JDBC.

Limitations de JDBC

  • Spark JDBC ne prend pas en charge les types complexes (MAP, ARRAY, STRUCT) en raison de l'absence de dialecte ClickHouse - utilisez le connecteur natif Spark-ClickHouse pour bénéficier d'une prise en charge complète des types complexes.
  • À ce jour, vous ne pouvez insérer des données via JDBC que dans des tables existantes (il n'existe actuellement aucun moyen de créer automatiquement la table lors de l'insertion du DF, comme Spark le fait avec d'autres connecteurs).
Navigation