Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Spark JDBC

Suportado pelo ClickHouse

JDBC é uma das fontes de dados mais usadas no Spark. Nesta seção, vamos detalhar como usar o conector JDBC oficial do ClickHouse com o Spark.

Ler dados

public static void main(String[] args) {
        // Inicializa a sessão do 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";

        //---------------------------------------------------------------------------------------------------
        // Carrega a tabela do ClickHouse usando o 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();

        //---------------------------------------------------------------------------------------------------
        // Carrega a tabela do ClickHouse usando o 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();

        // Encerra a sessão do Spark
        spark.stop();
    }

Gravar dados

 public static void main(String[] args) {
        // Inicializar a sessão do Spark
        SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate();

        // Detalhes de conexão JDBC
        String jdbcUrl = "jdbc:ch://localhost:8123/default";
        Properties jdbcProperties = new Properties();
        jdbcProperties.put("user", "default");
        jdbcProperties.put("password", "123456");

        // Criar um DataFrame de exemplo
        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);

        //---------------------------------------------------------------------------------------------------
        // Gravar o df no ClickHouse usando o método jdbc
        //---------------------------------------------------------------------------------------------------

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

        //---------------------------------------------------------------------------------------------------
        // Gravar o df no ClickHouse usando o método save
        //---------------------------------------------------------------------------------------------------

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

        // Encerrar a sessão do Spark
        spark.stop();
    }

Paralelismo

Ao usar o Spark JDBC, o Spark lê os dados usando uma única partição. Para obter maior concorrência, você precisa especificar partitionColumn, lowerBound, upperBound e numPartitions, que definem como particionar a tabela ao ler em paralelo com vários workers. Consulte a documentação oficial do Apache Spark para mais informações sobre as configurações de JDBC.

Limitações do JDBC

  • O Spark JDBC não oferece suporte a tipos complexos (MAP, ARRAY, STRUCT) devido à ausência do dialeto do ClickHouse — use o conector nativo Spark-ClickHouse para ter suporte completo a tipos complexos.
  • Até o momento, é possível inserir dados usando JDBC apenas em tabelas existentes (atualmente, não há como criar automaticamente a tabela na inserção de DF, como o Spark faz com outros conectores).
Navigation