Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Spark JDBC

Compatible con ClickHouse

JDBC es una de las fuentes de datos más utilizadas en Spark. En esta sección, explicaremos cómo usar el conector JDBC oficial de ClickHouse con Spark.

Leer datos

public static void main(String[] args) {
        // Inicializa la sesión de 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";

        //---------------------------------------------------------------------------------------------------
        // Carga la tabla desde ClickHouse mediante el método 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();

        //---------------------------------------------------------------------------------------------------
        // Carga la tabla desde ClickHouse mediante el método load
        //---------------------------------------------------------------------------------------------------
        Dataset<Row> df2 = spark.read()
                .format("jdbc")
                .option("url", jdbcURL)
                .option("user", "default")
                .option("password", "123456")
                .option("query", query)
                .load();

        df2.show();

        // Detiene la sesión de Spark
        spark.stop();
    }

Escritura de datos

 public static void main(String[] args) {
        // Inicializar la sesión de Spark
        SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate();

        // Detalles de conexión JDBC
        String jdbcUrl = "jdbc:ch://localhost:8123/default";
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("user", "default");
        jdbcProperties.put("password", "123456");

        // Crear un DataFrame de ejemplo
        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);

        //---------------------------------------------------------------------------------------------------
        // Escribir el df en ClickHouse usando el método jdbc
        //---------------------------------------------------------------------------------------------------

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

        //---------------------------------------------------------------------------------------------------
        // Escribir el df en ClickHouse usando el método save
        //---------------------------------------------------------------------------------------------------

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

        // Detener la sesión de Spark
        spark.stop();
    }

Paralelismo

Al usar Spark JDBC, Spark lee los datos con una sola partición. Para lograr una mayor concurrencia, debe especificar partitionColumn, lowerBound, upperBound y numPartitions, que describen cómo particionar la tabla al leer en paralelo con varios workers. Consulte la documentación oficial de Apache Spark para obtener más información sobre la configuración de JDBC.

Limitaciones de JDBC

  • Spark JDBC no admite tipos complejos (MAP, ARRAY, STRUCT) debido a la ausencia del dialecto de ClickHouse; use el conector nativo Spark-ClickHouse para obtener compatibilidad total con tipos complejos.
  • A día de hoy, solo puede insertar datos mediante JDBC en tablas existentes (actualmente, no hay forma de crear automáticamente la tabla al insertar el DF, como hace Spark con otros conectores).
Navigation