すべてのプロダクト
Search
ドキュメントセンター

Hologres:Spark による Hologres の読み取りと書き込み

最終更新日:Jul 08, 2026

Spark は、大規模データ処理のための統合分析エンジンです。Hologres は、コミュニティ Spark および EMR Serverless Spark と効率的に統合することで、データウェアハウスを迅速に構築できます。Hologres の Spark コネクタは、Spark クラスター内での Hologres カタログの作成に対応しています。これにより、外部テーブルを使用した高性能なバッチ読み取りとインポートが可能になり、ネイティブ JDBC を上回るパフォーマンスを実現できます。

制限事項

Spark コネクタは、Hologres バージョン 1.3 以降が必要です。インスタンスバージョンは、Hologres コンソールの[Instance Details]ページで確認できます。インスタンスがバージョン 1.3 より古い場合は、インスタンスのアップグレードを行うか、Hologres DingTalk グループ (ID:32314975) に参加してアップグレードをリクエストしてください。

前提条件

  • spark-sqlspark-shell、または pyspark コマンドを実行できる Spark 環境が必要です。依存関係の問題を回避し、より多くの機能にアクセスするには、Spark 3.3.0 以降を使用してください。

    • Alibaba Cloud EMR Spark を使用すると、Spark 環境を迅速にセットアップし、Hologres インスタンスに接続できます。詳細については、「EMR Spark features」をご参照ください。

    • または、独立した Spark 環境をセットアップすることもできます。詳細については、「Apache Spark」をご参照ください。

  • Spark を使用して Hologres のデータを読み書きするには、hologres-connector-spark-3.x コネクタが必要です。このトピックでは、バージョン 1.5.2 を例として使用します。これは Maven セントラルリポジトリ からダウンロードできます。このコネクタはオープンソースです。詳細については、「Hologres-Connectors」をご参照ください。

  • IntelliJ IDEA などの IDE を使用して Java で Spark ジョブを開発し、ローカルでデバッグするには、pom.xml ファイルに次の Maven 依存関係を追加してください。

    <dependency>
        <groupId>com.alibaba.hologres</groupId>
        <artifactId>hologres-connector-spark-3.x</artifactId>
        <version>1.5.2</version>
        <classifier>jar-with-dependencies</classifier>
    </dependency>

Hologres カタログ

Hologres コネクタ 1.5.2 以降は Hologres カタログをサポートしており、外部テーブルを使用して Hologres のデータを読み書きできます。

Spark の各 Hologres カタログは、Hologres のデータベースに対応します。Hologres カタログの各名前空間は、対応するデータベースのスキーマに対応します。以降のセクションでは、Spark で Hologres カタログを使用する方法について説明します。

説明

Hologres カタログはテーブルの作成をサポートしていません。

このトピックでは、Hologres インスタンス内の次のデータベースとテーブルを使用します:

test_db -- データベース
  public.test_table1 -- public スキーマのテーブル
  public.test_table2
  test_schema.test_table3  -- test_schema スキーマのテーブル

Hologres カタログの初期化

Spark クラスターで spark-sql を起動し、Hologres コネクタをロードして、カタログのパラメーターを指定します。

spark-sql --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
--conf spark.sql.catalog.hologres_external_test_db=com.alibaba.hologres.spark3.HoloTableCatalog \
--conf spark.sql.catalog.hologres_external_test_db.username=*** \
--conf spark.sql.catalog.hologres_external_test_db.password=*** \
--conf spark.sql.catalog.hologres_external_test_db.jdbcurl=jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db

Hologres カタログのコマンド

  • Hologres カタログのロード

    Spark の Hologres カタログは、Hologres のデータベースに対応します。この対応付けは、セッション中は固定です。

    USE hologres_external_test_db;
  • すべての名前空間のクエリ

    Spark の名前空間は、Hologres のスキーマに対応します。デフォルトスキーマは public です。デフォルトスキーマを変更するには、USE コマンドを使用します。

    -- Hologres カタログのすべての名前空間を表示します。これらは Hologres のデータベースのスキーマに対応します。
    SHOW NAMESPACES;
  • 名前空間内のテーブルのクエリ

    • すべてのテーブルのクエリ

      SHOW TABLES;
    • 特定の名前空間内のテーブルのクエリ

      USE test_schema;
      SHOW TABLES;
      
      -- または、次のステートメントを使用します。
      SHOW TABLES IN test_schema;
  • テーブルの読み取りと書き込み

    SELECT および INSERT ステートメントを使用して、外部テーブルのデータを読み書きします。

    -- テーブルから読み取ります。
    SELECT * FROM public.test_table1;
    
    -- テーブルに書き込みます。
    INSERT INTO test_schema.test_table3 SELECT * FROM public.test_table1;

Hologres へのデータインポート

このセクションのテストデータは、TPC-H データセットの customer テーブルのものです。Spark は、CSV ファイルからデータを読み取り、Hologres テーブルに書き込むことができます。サンプルの customer データをダウンロードできます。次の SQL 文は customer_holo_table を作成します。

CREATE TABLE customer_holo_table
(
  c_custkey    BIGINT ,
  c_name       TEXT   ,
  c_address    TEXT   ,
  c_nationkey  INT    ,
  c_phone      TEXT   ,
  c_acctbal    DECIMAL(15,2) ,
  c_mktsegment TEXT   ,
  c_comment    TEXT
);

Spark SQL を使用したインポート

Spark SQL では、カタログを使用して Hologres テーブルのメタデータをロードする方が便利です。一時テーブルを作成して Hologres テーブルを宣言することもできます。

説明
  • バージョン 1.5.2 より前の Hologres Spark コネクタは、カタログをサポートしていません。一時テーブルを作成することによってのみ、Hologres テーブルを宣言できます。

  • Hologres Spark コネクタのパラメーターの詳細については、「パラメーター」をご参照ください。

  1. Hologres カタログを初期化します。

    spark-sql --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
    --conf spark.sql.catalog.hologres_external_test_db=com.alibaba.hologres.spark3.HoloTableCatalog \
    --conf spark.sql.catalog.hologres_external_test_db.username=*** \
    --conf spark.sql.catalog.hologres_external_test_db.password=*** \
    --conf spark.sql.catalog.hologres_external_test_db.jdbcurl=jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db
  2. CSV データソースから Hologres テーブルにデータをインポートします。

    説明

    Spark の INSERT INTO 構文では、column_list を使用して一部の列を指定することはできません。たとえば、INSERT INTO hologresTable(c_custkey) SELECT c_custkey FROM csvTable を使用して c_custkey フィールドにのみデータを書き込むことはできません。

    特定のフィールドにデータを書き込みたい場合は、CREATE TEMPORARY VIEW ステートメントを使用して、必要なフィールドのみを含む Hologres 一時ビューを宣言します。

    カタログの使用

    -- Hologres カタログをロードします。
    USE hologres_external_test_db;
    
    -- CSV データソースを作成します。
    CREATE TEMPORARY VIEW csvTable (
        c_custkey BIGINT,
        c_name STRING,
        c_address STRING,
        c_nationkey INT,
        c_phone STRING,
        c_acctbal DECIMAL(15, 2),
        c_mktsegment STRING,
        c_comment STRING)
    USING csv OPTIONS (
        path "resources/customer", sep "," -- ローカルテストの場合は、ファイルへの絶対パスを使用します。
    );
    
    -- CSV テーブルから Hologres にデータを書き込みます。
    INSERT INTO public.customer_holo_table SELECT * FROM csvTable;

    一時ビューの使用

    -- CSV データソースを作成します。
    CREATE TEMPORARY VIEW csvTable (
        c_custkey BIGINT,
        c_name STRING,
        c_address STRING,
        c_nationkey INT,
        c_phone STRING,
        c_acctbal DECIMAL(15, 2),
        c_mktsegment STRING,
        c_comment STRING)
    USING csv OPTIONS (
        path "resources/customer", sep ","
    );
    
    -- Hologres の一時ビューを作成します。
    CREATE TEMPORARY VIEW hologresTable (
        c_custkey BIGINT,
        c_name STRING,
        c_phone STRING)
    USING hologres OPTIONS (
        jdbcurl "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db",
        username "***", 
        password "***", 
        table "customer_holo_table"
    );
    
    INSERT INTO hologresTable SELECT c_custkey,c_name,c_phone FROM csvTable;

DataFrame を使用したインポート

spark-shell や pyspark などのツールを使用して Spark ジョブを開発し、write API を呼び出してデータを書き込むことができます。 ジョブは CSV ファイルからデータを読み取り、DataFrame に変換してから、Hologres インスタンスに書き込みます。 以降のセクションでは、さまざまなプログラミング言語のサンプルコードを提供します。 Hologres Spark コネクターのパラメーターの詳細については、「パラメーター」をご参照ください。

Scala

import org.apache.spark.sql.types._
import org.apache.spark.sql.SaveMode

// CSV ソースのスキーマ。
val schema = StructType(Array(
  StructField("c_custkey", LongType),
  StructField("c_name", StringType),
  StructField("c_address", StringType),
  StructField("c_nationkey", IntegerType),
  StructField("c_phone", StringType),
  StructField("c_acctbal", DecimalType(15, 2)),
  StructField("c_mktsegment", StringType),
  StructField("c_comment", StringType)
))

// CSV ファイルから DataFrame にデータを読み取ります。
val csvDf = spark.read.format("csv").schema(schema).option("sep", ",").load("resources/customer")

// DataFrame を Hologres に書き込みます。
csvDf.write
.format("hologres")
.option("username", "***")
.option("password", "***")
.option("jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db")
.option("table", "customer_holo_table")
.mode(SaveMode.Append)
.save()

Java

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.*;
import org.apache.spark.sql.SaveMode;
import java.util.Arrays;
import java.util.List;

public class SparkTest {
    public static void main(String[] args) {
        // CSV ソースのスキーマ。
        List<StructField> asList =
                Arrays.asList(
                        DataTypes.createStructField("c_custkey", DataTypes.LongType, true),
                        DataTypes.createStructField("c_name", DataTypes.StringType, true),
                        DataTypes.createStructField("c_address", DataTypes.StringType, true),
                        DataTypes.createStructField("c_nationkey", DataTypes.IntegerType, true),
                        DataTypes.createStructField("c_phone", DataTypes.StringType, true),
                        DataTypes.createStructField("c_acctbal", new DecimalType(15, 2), true),
                        DataTypes.createStructField("c_mktsegment", DataTypes.StringType, true),
                        DataTypes.createStructField("c_comment", DataTypes.StringType, true));
        StructType schema = DataTypes.createStructType(asList);

        // ローカルモードで実行します。
        SparkSession spark = SparkSession.builder()
                .appName("Spark CSV Example")
                .master("local[*]") 
                .getOrCreate();

        // CSV ファイルから DataFrame にデータを読み取ります。
        // ローカルテストの場合は、customer データへの絶対パスを使用します。
        Dataset<Row> csvDf = spark.read().format("csv").schema(schema).option("sep", ",").load("resources/customer");

        // DataFrame を Hologres に書き込みます。
        csvDf.write.format("hologres").option(
           "username", "***").option(
           "password", "***").option(
           "jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db").option(
           "table", "customer_holo_table").mode(
           "append").save();
    }
}

pom.xml ファイルに、次の依存関係を追加します。

<dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.13</artifactId>
      <version>3.5.4</version>
      <scope>provided</scope>
</dependency>

Python

from pyspark.sql.types import *

# CSV ソースのスキーマ。
schema = StructType([
    StructField("c_custkey", LongType()),
    StructField("c_name", StringType()),
    StructField("c_address", StringType()),
    StructField("c_nationkey", IntegerType()),
    StructField("c_phone", StringType()),
    StructField("c_acctbal", DecimalType(15, 2)),
    StructField("c_mktsegment", StringType()),
    StructField("c_comment", StringType())
])

# CSV ファイルから DataFrame にデータを読み取ります。
csvDf = spark.read.csv("resources/customer", header=False, schema=schema, sep=',')

# DataFrame を Hologres に書き込みます。
csvDf.write.format("hologres").option(
    "username", "***").option(
    "password", "***").option(
    "jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db").option(
    "table", "customer_holo_table").mode(
    "append").save()

さまざまな言語で Spark ジョブを実行するには、次の手順に従います:

  • Scala

    • サンプルコードを使用して sparktest.scala ファイルを作成し、次のコマンドを実行してジョブを実行します。

      -- 依存関係をロードします。
      spark-shell --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar
      
      -- ローカルテストの場合は、絶対パスを使用してファイルをロードします。
      scala> :load D:/sparktest.scala
    • または、依存関係をロードした後に、サンプルコードをシェルに直接貼り付けて実行することもできます。

  • Java

    開発ツールを使用してサンプルコードをインポートし、Maven でパッケージ化します。たとえば、出力 JAR ファイルが spark_test.jar の場合、次のコマンドを実行してジョブを実行します。

    -- ジョブの JAR ファイルへの絶対パスを使用します。
    spark-submit --class SparkTest  --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar  D:\spark_test.jar
  • Python

    次のコマンドを実行した後、サンプルコードをシェルに貼り付けて実行できます。

    pyspark --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar

Hologresからのデータ読み取り

  • バージョン 1.3.2 以降、Spark コネクタは Hologres からのデータ読み取りをサポートしています。Spark のデフォルトの JDBC コネクタ と比較して、Spark コネクタ は Hologres テーブルのシャードに基づいてデータを並列で読み取ることで、より優れたパフォーマンスを発揮します。読み取りの並列度は、テーブルのシャード数に関連しています。Spark コネクタ は、read.max_task_count パラメーターを使用して並列度を制限できます。ジョブは最終的に Min(shardCount, max_task_count) 個の読み取りタスクを生成します。また、スキーマ推論もサポートしています。スキーマを指定しない場合、Hologres のテーブルスキーマから Spark のスキーマを推論します。

  • Spark コネクタのバージョン 1.5.0 以降、Hologres テーブルからのデータ読み取りでは、述語プッシュダウン、LIMIT プッシュダウン、カラムプルーニングがサポートされるようになりました。また、Hologres の SELECT QUERY を使用してデータを読み取ることもできます。このバージョンではバッチ読み取りモードが導入され、以前のバージョンと比較して読み取りパフォーマンスが 3〜4 倍向上します。

Spark SQLを使用したデータ読み取り

Spark SQL を使用する場合、カタログを使用して Hologres テーブルのメタデータをロードできます。または、一時ビューを作成して Hologres テーブルを宣言することもできます。

説明
  • バージョン 1.5.2 より前の Hologres Spark コネクタは、カタログをサポートしていません。Hologres テーブルは、一時ビューを作成することでのみ宣言できます。

  • Hologres Spark コネクタのパラメーターの詳細については、「パラメーター」をご参照ください。

  1. Hologres カタログを初期化します。

    spark-sql --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
    --conf spark.sql.catalog.hologres_external_test_db=com.alibaba.hologres.spark3.HoloTableCatalog \
    --conf spark.sql.catalog.hologres_external_test_db.username=*** \
    --conf spark.sql.catalog.hologres_external_test_db.password=*** \
    --conf spark.sql.catalog.hologres_external_test_db.jdbcurl=jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db
  2. Hologres からデータを読み取ります。

    • カタログを使用してデータを読み取ります。

      -- Hologres カタログをロードします。
      USE hologres_external_test_db;
      
      -- Hologres テーブルからデータを読み取ります。フィールドプルーニングと述語プッシュダウンがサポートされています。
      SELECT c_custkey,c_name,c_phone FROM public.customer_holo_table WHERE c_custkey < 500 LIMIT 10;
    • 一時ビューを作成してデータを読み取ります。

      テーブル

      CREATE TEMPORARY VIEW hologresTable
      USING hologres OPTIONS (
        jdbcurl "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db",
        username "***", 
        password "***", 
        read.max_task_count "80", -- Hologres テーブルからの読み取りに使用するタスクの最大数。
        table "customer_holo_table"
      );
      
      -- フィールドプルーニングと述語プッシュダウンがサポートされています。
      SELECT c_custkey,c_name,c_phone FROM hologresTable WHERE c_custkey < 500 LIMIT 10;

      クエリ

      CREATE TEMPORARY VIEW hologresTable
      USING hologres OPTIONS (
        jdbcurl "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db",
        username "***", 
        password "***", 
        read.query "SELECT c_custkey,c_name,c_phone FROM customer_holo_table WHERE c_custkey < 500 LIMIT 10"
      );
      
      SELECT * FROM hologresTable LIMIT 5;

HologresデータのDataFrameへの読み取り

spark-shell や pyspark などのツールを使用して Spark ジョブを開発する場合、Spark の read API を呼び出してデータを DataFrame にロードできます。以下の例では、さまざまなプログラミング言語で Hologres テーブルから DataFrame にデータを読み取る方法を示します。Hologres Spark コネクタのパラメーターの詳細については、「パラメーター」をご参照ください。

Scala

val readDf = (
  spark.read
    .format("hologres")
    .option("username", "***")
    .option("password", "***")
    .option("jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db")
    .option("table", "customer_holo_table")
    .option("read.max_task_count", "80") // Hologres テーブルからの読み取りに使用するタスクの最大数。
    .load()
    .filter("c_custkey < 500")
)

readDf.select("c_custkey", "c_name", "c_phone").show(10)

Java

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class SparkSelect {
    public static void main(String[] args) {
        
        // ローカルモードで実行
        SparkSession spark = SparkSession.builder()
                .appName("Spark CSV Example")
                .master("local[*]") 
                .getOrCreate();
                
        Dataset<Row> readDf = (
           spark.read
                .format("hologres")
                .option("username", "***")
                .option("password", "***")
                .option("jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db")
                .option("table", "customer_holo_table")
                .option("read.max_task_count", "80") // Hologres テーブルからの読み取りに使用するタスクの最大数。
                .load()
                .filter("c_custkey < 500")
        );
        readDf.select("c_custkey", "c_name", "c_phone").show(10);
    }
}

Maven の pom.xml ファイルに、以下の依存関係を追加します。

<dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.13</artifactId>
      <version>3.5.4</version>
      <scope>provided</scope>
</dependency>

Python

readDf = spark.read.format("hologres").option(
"username", "***").option(
"password", "***").option(
"jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/test_db").option(
"table", "customer_holo_table").option(
"read.max_task_count", "80").load().filter("c_custkey < 500")

readDf.select("c_custkey", "c_name", "c_phone").show(10)

さまざまなプログラミング言語で Spark ジョブを実行するには:

  • Scala

    • サンプルコードを使用して sparkselect.scala ファイルを作成し、以下のコマンドでジョブを実行できます。

      -- 依存関係をロード
      spark-shell --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar
      
      -- ローカルテストでは、絶対パスでファイルをロード
      scala> :load D:/sparkselect.scala
    • または、依存関係がロードされた後、サンプルコードをシェルに直接貼り付けて実行することもできます。

  • Java

    開発ツールを使用してサンプルコードをインポートし、Maven ツールを使用してパッケージ化できます。たとえば、パッケージ化された JAR が spark_select.jar という名前の場合、以下のコマンドでジョブを実行します。

    -- ジョブの JAR には絶対パスを使用
    spark-submit --class SparkSelect --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar  D:\spark_select.jar
  • Python

    以下のコマンドを実行した後、サンプルコードをシェルに直接貼り付けて実行できます。

    pyspark --jars hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar

パラメータ

一般パラメータ

パラメータ

デフォルト

必須

説明

username

なし

はい

password

なし

はい

  • AccessKey ID に対応する AccessKey Secret。詳細については、「Create an AccessKey」をご参照ください。

  • または、アカウントのパスワード。

table

なし

はい

読み取りまたは書き込み対象の Hologres テーブル名。

説明

データを読み取る際、代わりに read.query パラメーターを使用できます。

jdbcurl

なし

はい

Hologres リアルタイムデータ API の JDBC URL です。形式は jdbc:postgresql://<host>:<port>/<db_name> です。これらの詳細を確認するには、Hologres コンソールに移動し、左側のナビゲーションペインで Instances をクリックし、目的のインスタンスを選択して、Instance Details ページの Network Information セクションでホストとポート番号を確認します。

enable_serverless_computing

false

いいえ

サーバーレスコンピューティングリソースを使用するかどうかを指定します。このパラメーターは、bulk_load モードでの読み取り操作および書き込み操作にのみ適用されます。詳細については、「Serverless Computing ユーザーガイド」をご参照ください。

serverless_computing_query_priority

3

いいえ

サーバーレスコンピューティングの実行優先度。

statement_timeout_seconds

28800 (8時間)

いいえ

クエリ実行のタイムアウト時間 (秒単位)。

retry_count

3

いいえ

接続に失敗した場合の再試行回数。

direct_connect

サポートされている場合は、デフォルトで直接接続が使用されます。

いいえ

Hologres フロントエンド (アクセスノード) に直接接続するかどうかを指定します。エンドポイントのネットワークスループットは、多くの場合、バッチデータ操作のボトルネックになります。デフォルトでは、コネクタはスループットを向上させるために、利用可能な場合は直接接続を使用します。この動作を無効にするには、これを false に設定します。

書き込みパラメータ

Hologres コネクタは、Spark の SaveMode パラメーターをサポートしています。SQL の場合、これは INSERT INTO または INSERT OVERWRITE に対応します。DataFrame の場合、データを書き込むときに SaveMode を Append または Overwrite に設定できます。Overwrite モードは、書き込み操作用の一時テーブルを作成し、成功すると元のテーブルを置き換えます。このモードは必要な場合にのみ使用してください。

パラメータ

以前の名前

デフォルト

必須

説明

write.mode

copy_write_mode

auto

いいえ

書き込みモード。書き込みモードの比較については、「Batch write modes」をご参照ください。有効な値は次のとおりです。

  • auto (デフォルト):コネクタは、Hologres のバージョンと宛先テーブルのメタデータに基づいて最適なモードを自動的に選択します。 選択ロジックは以下の通りです。

    1. Hologres インスタンスが v2.2.25 以降でテーブルにプライマリキーがある場合、bulk_load_on_conflict モードが使用されます。

    2. Hologres インスタンスが v2.1.0 以降であり、テーブルにプライマリキーがない場合、bulk_load モードが使用されます。

    3. Hologres インスタンスが v1.3 以降の場合、stream モードが使用されます。

    4. それ以外の場合、insert モードが使用されます。

  • stream: SQL 実行を高速化するための固定プランを使用します。 固定プランでは、COPY は Hologres v1.3 で導入された機能です。 INSERT メソッドと比較して、COPY は、より高いスループット (ストリーミング方式であるため)、より低いデータレイテンシー、およびクライアントのメモリ消費量の削減 (データをバッチ処理しないため) を提供します。

    説明

    Hologres コネクタ v1.3.0 以降、および Hologres v1.3.34 以降が必要です。

  • bulk_load: バッチ COPY を使用します。 Fixed Plan のストリーミング COPY と比較して、バッチ COPY は、高 RPS 条件下で Hologres インスタンスへの負荷が低くなりますが、主キーのないテーブルへの書き込みのみをサポートします。

    説明

    Hologres コネクタ v1.4.2 以降、および Hologres v2.1.0 以降が必要です。

  • bulk_load_on_conflict: バッチ COPY を使用してプライマリキーを持つテーブルに書き込み、重複するプライマリキーを処理できます。デフォルトでは、プライマリキーを持つ Hologres テーブルへのバッチデータインポートはテーブルロックをトリガーし、複数の接続からの同時書き込み操作を制限します。コネクタは、宛先テーブルの分散キーによってデータを再配布できるため、各 Spark タスクが単一のシャードに書き込めるようになります。これにより、テーブルロックがシャードレベルのロックに軽減され、同時書き込みが可能になり、書き込みパフォーマンスが向上します。各接続は少数のシャードのデータのみを維持するため、この最適化は小さいファイルの数を大幅に削減し、Hologres のメモリ使用量を低減します。テストによると、同時書き込みの前にデータを再パーティション化すると、stream モードと比較してシステム負荷を約 67% 削減できることが示されています。

    説明

    Hologres コネクタ v1.4.2 以降、および Hologres v2.2.25 以降が必要です。

  • insert: INSERT メソッドを使用してデータを書き込みます。

  • stage: バッチ書き込みにステージテーブルを使用します。このモードは一時的なストレージステージを介して、ほぼリアルタイムでデータをインポートし、INSERT FROM SELECT 文を使用して宛先テーブルにロードします。バッチシナリオでは、このモードは他のモードよりもパフォーマンスが高く、システム負荷が低くなります。また、サーバーレスコンピューティングリソースの使用もサポートします。INSERT INTO 操作と INSERT OVERWRITE 操作の両方がサポートされています。Hologres v4.1.0 以降および connector v1.6.1 以降が必要です。

write.copy.max_buffer_size

max_cell_buffer_size

52428800 (50 MB)

いいえ

COPY モードで書き込む際のローカルバッファの最大サイズ。通常、この値を調整する必要はありません。ただし、非常に長い文字列などの大きなフィールドを書き込む際にバッファオーバーフローが発生した場合は、この値を大きくすることができます。

write.copy.dirty_data_check

copy_write_dirty_data_check

false

いいえ

ダーティデータをチェックするかどうかを指定します。有効にすると、この機能により書き込みに失敗した正確な行を特定できます。ただし、これは書き込みパフォーマンスに影響します。トラブルシューティング時以外は、この機能を無効のままにしてください。

write.on_conflict_action

なし

INSERT_OR_REPLACE

いいえ

書き込み操作で宛先テーブルのプライマリキーの競合が発生した場合に実行するアクション。

  • INSERT_OR_IGNORE:プライマリキーの競合が発生した場合、データは書き込まれません。

  • INSERT_OR_UPDATE:プライマリキーの競合が発生した場合、指定された列が更新されます。

  • INSERT_OR_REPLACE:プライマリキーの競合が発生した場合、すべての列が更新されます。

write.stage.compression

なし

false

いいえ

write.modestage に設定されている場合に有効になります。これを true に設定すると、ステージ書き込み時に圧縮が有効になります。Hologres v4.2.8 以降およびコネクタ v1.6.2 以降が必要です。

以下のパラメーターは、write.modeinsert に設定されている場合にのみ有効になります。

パラメータ

以前の名前

デフォルト

必須

説明

write.insert.dynamic_partition

dynamic_partition

false

いいえ

write.modeinsert の場合、これを true に設定すると、親パーティションテーブルへの書き込み時に、存在しないパーティションが自動的に作成されます。

write.insert.batch_size

write_batch_size

512

いいえ

各書き込みスレッドの最大バッチサイズ。Put 操作の数がこの値に達すると、バッチコミットがトリガーされます。

write.insert.batch_byte_size

write_batch_byte_size

2097152 (2 MB)

いいえ

各書き込みスレッドの最大バッチサイズ (バイト単位)。 デフォルト値は 2 MB です。Put データのバイトサイズがこの値に達すると、バッチコミットがトリガーされます。

write.insert.max_interval_ms

write_max_interval_ms

10000

いいえ

最後のコミットからの経過時間がこの値を超えると、バッチコミットが実行されます。

write.insert.thread_size

write_thread_size

1

いいえ

同時書き込みスレッドの数。各スレッドは1つのデータベース接続を使用します。

write.rps_limit

なし

-1

いいえ

タスクごとの書き込みレート制限 (行/秒 (RPS))。デフォルト値の -1 は制限なしを意味します。

読み取りパラメータ

パラメータ

以前の名前

(v1.5.0以前)

デフォルト

必須

説明

read.mode

bulk_read

auto

いいえ

読み取りモード。有効な値は次のとおりです。

  • auto (デフォルト): コネクタは Hologres のバージョンとテーブルメタデータに基づいて最適なモードを自動的に選択します。選択ロジックは次のとおりです。

    1. 読み取り対象のフィールドに JSONB データ型が含まれる場合、select モードが使用されます。

    2. インスタンスが v3.0.24 以降の場合、bulk_read_compressed モードが使用されます。

    3. その他の場合、bulk_read モードが使用されます。

  • bulk_read: COPY OUT メソッドを使用して arrow 形式でデータを読み込みます。これは select モードよりも数倍高速です。Hologres から JSONB 型を読み取ることは、現在サポートされていません。

  • bulk_read_compressed: COPY OUT メソッドを使用して、Arrow 形式の圧縮データを読み取ります。非圧縮データを読み取る場合と比較して、帯域幅が約 45% 節約されます。

  • select: 標準の SELECT 文を使用してデータを読み取ります。

read.max_task_count

max_partition_count

80

いいえ

データ読み取り時の同時タスクの最大数を指定します。コネクタはテーブルを複数のパーティションに分割し、各パーティションは単一の Spark タスクによって処理されます。テーブルのシャード数がこの値より少ない場合、パーティション数はシャード数に制限されます。

read.copy.max_buffer_size

/

52428800 (50 MB)

いいえ

COPY モードで読み取る際のローカルバッファの最大サイズです。フィールドサイズが大きいために例外が発生した場合は、この値を大きくします。

read.push_down_predicate

push_down_predicate

true

いいえ

述語プッシュダウンを有効にするかどうかを指定します。有効にすると、フィルター条件やカラムプルーニングなどの操作がデータソースにプッシュダウンされます。

read.push_down_limit

push_down_limit

true

いいえ

LIMIT プッシュダウンを有効にするかどうかを指定します。

read.select.batch_size

scan_batch_size

256

いいえ

read.modeselect に設定されている場合に有効になります。Hologres から読み取る際に、1 回のスキャン操作でフェッチする行数を指定します。

read.select.timeout_seconds

scan_timeout_seconds

60

いいえ

read.modeselect に設定されている場合に有効になります。Hologres から読み取る際のスキャン操作のタイムアウト期間を指定します。

read.query

query

なし

いいえ

Hologres からの読み取りには、query を使用します。このパラメーターは table パラメーターと併用できません。

説明
  • query メソッドを使用してデータを読み取る場合、単一のタスクしか使用できません。プレディケートプッシュダウンはサポートされていません。

  • table メソッドを使用してデータを読み取る場合、読み取り操作は Hologres テーブルの ShardCount に基づいて、並列で実行される複数のタスクに分割されます。

read.split.strategy

なし

auto

いいえ

並列読み取り用にテーブルデータを複数のタスクに分割する戦略を定義します。有効な値は次のとおりです。

  • auto (デフォルト): コネクタが最適な戦略を自動的に選択します。

  • shard: Hologres のシャードに基づいてデータをシャーディングし、各タスクがシャードの一部を読み取ります。これは、シャードの分散が明確なテーブルに適しています。

  • range: 指定された列の値の範囲に基づいてデータを分割します。この設定では、read.split.columnread.split.lower_boundread.split.upper_bound、および read.split.num パラメーターが必要です。

  • partition は、パーティション列の値に基づいてデータをシャーディングします。このオプションは、read.split.column および read.split.num パラメーターと併用する必要があります。パーティションテーブルまたはパーティションビューに適用されます。

説明

コネクタ v1.6.1 以降でサポートされています。

read.split.column

なし

なし

いいえ

分割列の名前。このパラメーターは、read.split.strategyrange または partition の場合に必須です。

read.split.lower_bound

なし

なし

いいえ

分割下限は、read.split.strategyrange に設定されている場合に必須であり、範囲分割の下限値を指定します。

read.split.upper_bound

なし

なし

いいえ

分割上限は、範囲ベースのシャードの上限を指定します。このパラメーターは read.split.strategyrange に設定されている場合に必須です。

read.split.num

なし

なし

いいえ

分割数。このパラメーターは、 read.split.strategyrange または partition の場合に必須です。データを読み込むために分割するタスクの数を指定します。

データ型マッピング

Spark の型

Hologres の型

ShortType

SMALLINT

IntegerType

INT

LongType

BIGINT

StringType

TEXT

StringType

JSON

StringType

JSONB

DecimalType

NUMERIC(38, 18)

BooleanType

BOOL

DoubleType

DOUBLE PRECISION

FloatType

FLOAT4

TimestampType

TIMESTAMPTZ

DateType

DATE

BinaryType

BYTEA

BinaryType

ROARINGBITMAP

ArrayType(IntegerType)

INT4[]

ArrayType(LongType)

INT8[]

ArrayType(FloatType)

FLOAT4[]

ArrayType(DoubleType)

FLOAT8[]

ArrayType(BooleanType)

BOOLEAN[]

ArrayType(StringType)

TEXT[]

接続数の計算

Hologres-Connector-Spark は、読み取りおよび書き込み操作に一定数の JDBC 接続を使用します。接続数は次の要因によって決まります。

  • Spark の並列度:ジョブ実行中に実行される並行タスクの数です。Spark UI で確認できます。

  • タスクごとに使用される接続数:

    • COPY モードで書き込む場合、各タスクは 1 つの JDBC 接続を使用します。

    • INSERT モードでの書き込み時、各タスクは write_thread_size 個の JDBC 接続を使用します。

    • データを読み取る場合、各タスクは 1 つの JDBC 接続を使用します。

  • その他の操作:ジョブの開始時に、スキーマ取得などのタスクのために一時的に 1 つの接続を使用する場合があります。

ジョブの合計接続数は、次の式で計算できます。

項目

接続数

Querying metadata from the catalog

1

データの読み取り

並列度 * 1 + 1

COPY モードでの書き込み

並列度 * 1 + 1

INSERT モードでの書き込み

並列度 * write_thread_size + 1

この計算は、Spark の並行タスクの容量が、ジョブが生成するタスク数を超えていることが前提です。

Spark の同時実行タスクのキャパシティは、spark.executor.instances などのユーザー設定パラメーターと、Hadoop のファイルブロック分割ポリシーによって決まります。詳細については、「Apache Hadoop」をご参照ください。

Spark コネクターのリリースノート

バージョン

リリース日

新機能

バグ修正

1.6.1

2026-02

  • 一時ステージテーブルを使用して書き込みパフォーマンスを向上させるステージ書き込みモードを追加しました。この機能には Hologres v4.1.0 以降が必要です。

  • ステージモードでの INSERT INTO および INSERT OVERWRITE 操作のサポートを追加しました。

  • overwrite 操作の一時テーブルクリーンアップロジックを最適化しました。

  • タスクごとの書き込みレートを制御する write.rps_limit パラメーターを追加しました。

  • overwrite 操作中に DDL を実行すると発生する強制同期再生の問題を修正しました。

1.6.0

2025-12

  • shardrange、および partition の 3 つの読み取り分割戦略をサポートするために、read.split.strategy パラメーターを追加しました。

  • Arrow ベースの読み取りで JSONB データ型のサポートを追加しました。

  • UPDATE 操作中に NULL 値を無視する write.insert.ignore_null_when_update パラメーターを追加しました。

  • JaCoCo テストカバレッジレポートのサポートを追加しました。

  • 1970 年より前の date 値を書き込む際のエラーを修正しました。

1.5.6

2025-11

  • AKV4 認証方式のサポートを追加しました。

  • COPY 書き込みパフォーマンスを最適化するための write.copy.disable_right_join パラメーターを追加しました。

  • カタログ書き込み時のカラム型チェックロジックを最適化しました。

1.5.5

2025-10

  • 低精度データを高精度データ型に書き込むサポートを追加しました。

  • トラブルシューティングを簡素化するため、appnametaskid などのプレフィックスをログに追加しました。

  • COPY OUT 操作で Arrow LZ4 圧縮を有効にしました。

  • パラメーターのフォーマットと検証を最適化しました。

1.5.4

2025-09

  • テキストカラムから U+0000 文字を自動的に削除する remove_u0000 パラメーターを追加しました。

  • Hologres カタログをリファクタリングし、名前空間をスキーマにマッピングするようにしました。

  • データシャーディング用の RepartitionUtil ユーティリティクラスを追加しました。

  • ドキュメントをリファクタリングし、リンクを更新しました。

1.5.2

2025-08

  • 外部テーブルを使用して Hologres データの読み取りと書き込みを可能にする Hologres カタログを導入しました。

  • 述語プッシュダウンとリミットプッシュダウンのサポートを追加しました。

  • 読み取り操作で bulk_read バッチモードを有効にしたことで、パフォーマンスが桁違いに向上しました。

  • 読み取りパフォーマンスを最適化しました。

1.5.0

2025-06

  • 述語プッシュダウン、リミットプッシュダウン、およびカラムプルーニングのサポートを追加しました。

  • SELECT クエリを使用してデータを読み取れるようになりました。

  • 読み取り操作でバッチモードを有効にしました。

  • 読み取りに関する問題を修正しました。

1.4.2

2025-04

  • プライマリキーのないテーブルへのバッチ書き込み用の bulk_load 書き込みモードを導入しました。

  • プライマリキーを持つテーブルでのプライマリキーの競合を処理する bulk_load_on_conflict モードを追加しました。

  • 書き込みパフォーマンスを最適化しました。

1.3.2

2025-02

  • Hologres からのデータ読み取りに対応しました。

  • シャードによる並列読み取りが可能になりました。

  • 自動スキーマ推論に対応しました。

  • 初期読み取り機能を安定化しました。

1.3.0

2025-01

  • stream (固定 COPY) 書き込みモードを導入しました。

  • Hologres v1.3 の固定 COPY 機能に対応しました。

  • 書き込みスループットとレイテンシーを最適化しました。