Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Spark JDBC

متوافق مع ClickHouse

يُعد JDBC أحد أكثر مصادر البيانات شيوعًا في Spark. في هذا القسم، سنوضّح كيفية استخدام موصل JDBC الرسمي لـ ClickHouse مع Spark.

قراءة البيانات

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";

        //---------------------------------------------------------------------------------------------------
        // تحميل الجدول من ClickHouse باستخدام الأسلوب 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();

        //---------------------------------------------------------------------------------------------------
        // تحميل الجدول من ClickHouse باستخدام الأسلوب load
        //---------------------------------------------------------------------------------------------------
        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) {
        // 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();
    }

التوازي

عند استخدام Spark JDBC، يقرأ Spark البيانات باستخدام تقسيم واحد. لتحقيق درجة أعلى من التزامن، يجب تحديد partitionColumn وlowerBound وupperBound وnumPartitions، وهي تحدد كيفية تقسيم الجدول عند القراءة بالتوازي من عدة عمّال. يُرجى زيارة الوثائق الرسمية لـ Apache Spark للحصول على مزيد من المعلومات حول إعدادات JDBC.

قيود JDBC

  • يفتقر Spark JDBC إلى دعم الأنواع المعقدة (MAP, ARRAY, STRUCT) بسبب عدم توفر dialect خاص بـ ClickHouse — استخدم الموصل الأصلي Spark-ClickHouse للحصول على دعم كامل للأنواع المعقدة.
  • حتى الآن، لا يمكنك إدراج البيانات باستخدام JDBC إلا في الجداول الموجودة مسبقًا (ولا توجد حاليًا طريقة لإنشاء الجدول تلقائيًا عند إدراج DF، كما يفعل Spark مع الموصلات الأخرى).
Navigation