JDBC から他のデータベースへ

Spark SQL には、JDBC を使用して他のデータベースからデータを読み取ることができるデータソースも含まれています。この機能は、JdbcRDD を使用するよりも優先されるべきです。これは、結果が DataFrame として返され、Spark SQL で簡単に処理したり、他のデータソースと結合したりできるためです。また、JDBC データソースは、ユーザーが ClassTag を提供する必要がないため、Java や Python からの使用も容易です。(これは、他のアプリケーションが Spark SQL を使用してクエリを実行できるようにする Spark SQL JDBC サーバーとは異なります。)

開始するには、Spark クラスパスに、使用するデータベースの JDBC ドライバーを含める必要があります。たとえば、Spark Shell から postgres に接続するには、次のコマンドを実行します。

./bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

データソースオプション

Spark は、JDBC の以下の大文字/小文字を区別しないオプションをサポートしています。JDBC のデータソースオプションは、以下のように設定できます。

接続プロパティについては、データソースオプションで JDBC 接続プロパティを指定できます。user および password は、通常、データソースへのログインのための接続プロパティとして提供されます。

プロパティ名デフォルト意味スコープ
url (なし) 接続するための jdbc:subprotocol:subname の形式の JDBC URL。ソース固有の接続プロパティは URL で指定できます。例: jdbc:postgresql:///test?user=fred&password=secret 読み書き
dbtable (なし) 読み書きする JDBC テーブル。読み込みパスで使用する場合、SQL クエリの FROM 句で有効なものはすべて使用できることに注意してください。たとえば、完全なテーブルの代わりに、括弧内のサブクエリを使用することもできます。dbtable オプションと query オプションを同時に指定することはできません。 読み書き
query (なし) Spark にデータを読み込むために使用されるクエリ。指定されたクエリは括弧で囲まれ、FROM 句のサブクエリとして使用されます。Spark はサブクエリ句にエイリアスも割り当てます。例として、Spark は JDBC ソースに次のような形式のクエリを発行します。

SELECT <columns> FROM (<user_specified_query>) spark_gen_alias

このオプションを使用する際の制約をいくつか以下に示します。
  1. dbtable オプションと query オプションを同時に指定することはできません。
  2. query オプションと partitionColumn オプションを同時に指定することはできません。partitionColumn オプションを指定する必要がある場合、サブクエリは dbtable オプションを使用して指定でき、パーティション列は dbtable の一部として提供されるサブクエリエイリアスを使用して修飾できます。

    spark.read.format("jdbc")
    .option("url", jdbcUrl)
    .option("query", "select c1, c2 from t1")
    .load()
読み込み
prepareQuery (なし) query と組み合わせて最終的なクエリを形成するプレフィックス。指定された query は FROM 句のサブクエリとして括弧で囲まれ、一部のデータベースはサブクエリですべての句をサポートしていないため、prepareQuery プロパティは、そのような複雑なクエリを実行する方法を提供します。例として、Spark は JDBC ソースに次のような形式のクエリを発行します。

<prepareQuery> SELECT <columns> FROM (<user_specified_query>) spark_gen_alias

以下にいくつかの例を示します。
  1. MSSQL Server はサブクエリで WITH 句を受け入れませんが、そのようなクエリを prepareQueryquery に分割することは可能です。
    spark.read.format("jdbc")
    .option("url", jdbcUrl)
    .option("prepareQuery", "WITH t AS (SELECT x, y FROM tbl)")
    .option("query", "SELECT * FROM t WHERE x > 10")
    .load()
  2. MSSQL Server はサブクエリで一時テーブル句を受け入れませんが、そのようなクエリを prepareQueryquery に分割することは可能です。
    spark.read.format("jdbc")
    .option("url", jdbcUrl)
    .option("prepareQuery", "(SELECT * INTO #TempTable FROM (SELECT * FROM tbl) t)")
    .option("query", "SELECT * FROM #TempTable")
    .load()
読み書き
driver (なし) この URL に接続するために使用される JDBC ドライバーのクラス名。 読み書き
partitionColumn, lowerBound, upperBound (なし) これらのいずれかが指定された場合は、すべて指定する必要があります。さらに、numPartitions も指定する必要があります。これらは、複数のワーカーから並列で読み取る際のテーブルのパーティション分割方法を記述します。partitionColumn は、対象のテーブルの数値、日付、またはタイムスタンプの列である必要があります。lowerBound および upperBound はパーティションのストライドを決定するためだけに使用され、テーブル内の行をフィルタリングするためではないことに注意してください。したがって、テーブルのすべての行がパーティション分割され、返されます。このオプションは読み込みにのみ適用されます。

spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("dbtable", "(select c1, c2 from t1) as subq")
.option("partitionColumn", "c1")
.option("lowerBound", "1")
.option("upperBound", "100")
.option("numPartitions", "3")
.load()
読み込み
numPartitions (なし) テーブルの読み書きの並列処理に使用できる最大パーティション数。これは、JDBC 接続の最大同時接続数も決定します。書き込みパーティション数がこの制限を超える場合、書き込み前に coalesce(numPartitions) を呼び出すことによって、この制限まで減少させます。 読み書き
queryTimeout 0 ドライバーが指定された秒数で Statement オブジェクトの実行を待機する秒数。ゼロは無制限を意味します。書き込みパスでは、このオプションは JDBC ドライバーが setQueryTimeout API をどのように実装しているかによって異なります。たとえば、h2 JDBC ドライバーは、単一の JDBC バッチ全体ではなく、各クエリのタイムアウトをチェックします。 読み書き
fetchsize 0 JDBC フェッチサイズ。これは、1 回の往復で取得する行数を決定します。これは、デフォルトのフェッチサイズが小さい JDBC ドライバー(例: Oracle で 10 行)でパフォーマンスに役立つ場合があります。 読み込み
batchsize 1000 JDBC バッチサイズ。これは、1 回の往復で挿入する行数を決定します。これは、JDBC ドライバーでパフォーマンスに役立つ場合があります。このオプションは書き込みにのみ適用されます。 書き込み
isolationLevel READ_UNCOMMITTED トランザクション分離レベル。現在の接続に適用されます。NONEREAD_COMMITTEDREAD_UNCOMMITTEDREPEATABLE_READ、または SERIALIZABLE のいずれかであり、JDBC の Connection オブジェクトで定義された標準のトランザクション分離レベルに対応し、デフォルトは READ_UNCOMMITTED です。java.sql.Connection のドキュメントを参照してください。 書き込み
sessionInitStatement (なし) リモート DB への各データベースセッションが開かれ、データの読み取りが開始される前に、このオプションはカスタム SQL ステートメント(または PL/SQL ブロック)を実行します。これを使用して、セッション初期化コードを実装します。例: option("sessionInitStatement", """BEGIN execute immediate 'alter session set "_serial_direct_read"=true'; END;""") 読み込み
truncate false これは JDBC ライター関連のオプションです。SaveMode.Overwrite が有効な場合、このオプションは既存のテーブルをドロップして再作成するのではなく、テーブルを切り捨てるように Spark に指示します。これはより効率的であり、テーブルメタデータ(例: インデックス)が削除されるのを防ぐことができます。ただし、新しいデータが異なるスキーマを持つ場合など、一部のケースでは機能しません。障害が発生した場合、ユーザーは DROP TABLE を再度使用するために truncate オプションをオフにする必要があります。また、DBMS 間での TRUNCATE TABLE の動作の違いにより、常に安全に使用できるわけではありません。MySQLDialect、DB2Dialect、MsSqlServerDialect、DerbyDialect、および OracleDialect はこれをサポートしていますが、PostgresDialect およびデフォルトの JDBCDialect はサポートしていません。未知またはサポートされていない JDBCDialect の場合、ユーザーオプション truncate は無視されます。 書き込み
cascadeTruncate 各 JDBCDialect の isCascadeTruncate で指定された、対象の JDBC データベースのデフォルトの連鎖切り捨て動作。 これは JDBC ライター関連のオプションです。有効で、JDBC データベース(現在 PostgreSQL と Oracle)でサポートされている場合、このオプションは TRUNCATE TABLE t CASCADE の実行を許可します(PostgreSQL の場合、下流のテーブルを誤って切り捨てるのを防ぐために TRUNCATE TABLE ONLY t CASCADE が実行されます)。これは他のテーブルに影響を与えるため、注意して使用する必要があります。 書き込み
createTableOptions これは JDBC ライター関連のオプションです。指定された場合、このオプションは、テーブルを作成する際にデータベース固有のテーブルおよびパーティションオプションを設定できるようにします(例: CREATE TABLE t (name string) ENGINE=InnoDB.)。 書き込み
createTableColumnTypes (なし) テーブルを作成する際のデフォルトの代わりに、データベースの列データ型として使用されます。データ型情報は、CREATE TABLE 列構文と同じ形式で指定する必要があります(例: "name CHAR(64), comments VARCHAR(1024)")。指定された型は、有効な Spark SQL データ型である必要があります。 書き込み
customSchema (なし) JDBC コネクタからデータを読み取るために使用するカスタムスキーマ。例: "id DECIMAL(38, 0), name STRING"。部分的なフィールドを指定することもでき、残りはデフォルトの型マッピングを使用します。例: "id DECIMAL(38, 0)"。列名は JDBC テーブルの対応する列名と同一である必要があります。ユーザーは、デフォルトを使用する代わりに、Spark SQL の対応するデータ型を指定できます。 読み込み
pushDownPredicate true 述語プッシュダウンを JDBC データソースに有効または無効にするオプション。デフォルト値は true で、この場合 Spark は可能な限りフィルターを JDBC データソースにプッシュダウンします。そうでない場合(false に設定されている場合)、フィルターは JDBC データソースにプッシュダウンされず、すべてのフィルターは Spark によって処理されます。述語プッシュダウンは通常、述語フィルタリングが Spark の方が JDBC データソースよりも高速な場合にオフにされます。 読み込み
pushDownAggregate true V2 JDBC データソースでの集計プッシュダウンを有効または無効にするオプション。デフォルト値は true で、この場合 Spark は集計を JDBC データソースにプッシュダウンします。そうでない場合(false に設定されている場合)、集計は JDBC データソースにプッシュダウンされません。集計プッシュダウンは通常、集計が Spark の方が JDBC データソースよりも高速な場合にオフにされます。集計は、すべての集計関数と関連するフィルターがプッシュダウンできる場合にのみプッシュダウンできることに注意してください。numPartitions が 1 と等しい場合、またはグループ化キーが partitionColumn と同じ場合、Spark は集計をデータソースに完全にプッシュダウンし、データソース出力に対する最終的な集計を適用しません。そうでない場合、Spark はデータソース出力に対する最終的な集計を適用します。 読み込み
pushDownLimit true LIMIT プッシュダウンを V2 JDBC データソースに有効または無効にするオプション。LIMIT プッシュダウンには LIMIT + SORT、別名 Top N オペレーターも含まれます。デフォルト値は true で、この場合 Spark は LIMIT または LIMIT with SORT を JDBC データソースにプッシュダウンします。そうでない場合(false に設定されている場合)、LIMIT または LIMIT with SORT は JDBC データソースにプッシュダウンされません。numPartitions が 1 より大きい場合、LIMIT または LIMIT with SORT がプッシュダウンされても、Spark はデータソースからの結果に LIMIT または LIMIT with SORT を適用します。そうでない場合、LIMIT または LIMIT with SORT がプッシュダウンされ、numPartitions が 1 と等しい場合、Spark はデータソースからの結果に LIMIT または LIMIT with SORT を適用しません。 読み込み
pushDownOffset true OFFSET プッシュダウンを V2 JDBC データソースに有効または無効にするオプション。デフォルト値は true で、この場合 Spark は OFFSET を JDBC データソースにプッシュダウンします。そうでない場合(false に設定されている場合)、Spark は OFFSET を JDBC データソースにプッシュダウンしようとしません。pushDownOffset が true で numPartitions が 1 と等しい場合、OFFSET は JDBC データソースにプッシュダウンされます。そうでない場合、OFFSET はプッシュダウンされず、Spark はデータソースからの結果に OFFSET を適用します。 読み込み
pushDownTableSample true TABLESAMPLE プッシュダウンを V2 JDBC データソースに有効または無効にするオプション。デフォルト値は true で、この場合 Spark は TABLESAMPLE を JDBC データソースにプッシュダウンします。そうでない場合(false に設定されている場合)、TABLESAMPLE は JDBC データソースにプッシュダウンされません。 読み込み
keytab (なし) JDBC クライアント用の Kerberos keytab ファイルの場所(--files オプションの spark-submit または手動で、すべてのノードに事前にアップロードされている必要があります)。パス情報が見つかると、Spark は keytab が手動で配布されたと見なし、それ以外の場合は --files が想定されます。keytabprincipal の両方が定義されている場合、Spark は Kerberos 認証を試みます。 読み書き
principal (なし) JDBC クライアントの Kerberos プリンシパル名を指定します。keytabprincipal の両方が定義されている場合、Spark は Kerberos 認証を試みます。 読み書き
refreshKrb5Config false このオプションは、新しい接続を確立する前に、JDBC クライアントの Kerberos 構成をリフレッシュするかどうかを制御します。構成をリフレッシュしたい場合は true に設定し、それ以外の場合は false に設定します。デフォルト値は false です。このオプションを true に設定して複数の接続を確立しようとすると、競合状態が発生する可能性があることに注意してください。考えられる状況の 1 つは次のとおりです。
  1. refreshKrb5Config フラグがセキュリティコンテキスト 1 で設定されている
  2. 対応する DBMS 用の JDBC 接続プロバイダーが使用される
  3. krb5.conf が変更されたが、JVM はまだそれをリロードする必要があることを認識していない
  4. Spark がセキュリティコンテキスト 1 に対して正常に認証される
  5. JVM が変更された krb5.conf からセキュリティコンテキスト 2 をロードする
  6. Spark が以前に保存されたセキュリティコンテキスト 1 を復元する
  7. 変更された krb5.conf の内容は消える
読み書き
connectionProvider (なし) この URL に接続するために使用される JDBC 接続プロバイダーの名前。例: db2mssql。JDBC データソースでロードされたプロバイダーのいずれかである必要があります。指定されたドライバーとオプションを処理できるプロバイダーが複数ある場合に曖昧さを解消するために使用されます。選択されたプロバイダーは、spark.sql.sources.disabledJdbcConnProviderList によって無効にされてはなりません。 読み書き
preferTimestampNTZ false このオプションが true に設定されている場合、TIMESTAMP WITHOUT TIME ZONE 型は Spark の TimestampNTZ 型として推論されます。それ以外の場合、TIMESTAMP 型(TIMESTAMP WITH LOCAL TIME ZONE と同等)として解釈されます。この設定は、TIMESTAMP WITHOUT TIME ZONE データ型の推論にのみ影響します。TIMESTAMP WITH LOCAL TIME ZONE および TIMESTAMP WITH TIME ZONE データ型は、この設定に関係なく、一貫して Spark の Timestamp 型として解釈されます。 読み込み
hint (なし) このオプションは、読み取りのためのヒントを指定するために使用されます。サポートされているヒント形式は C スタイルのコメントのバリアントです。`/*+ ` で始まり ` */` で終わる必要があります。現在、このオプションは MySQLDialect、OracleDialect、および DatabricksDialect でのみサポートされています。 読み込み

Kerberos 認証と keytab の組み合わせは、JDBC ドライバーで常にサポートされているわけではないことに注意してください。
keytab および principal 設定オプションを使用する前に、次の要件が満たされていることを確認してください。

以下のデータベースには組み込み接続プロバイダーがあります。

要件が満たされていない場合は、カスタム認証を処理するために JdbcConnectionProvider 開発者 API を検討してください。

# Note: JDBC loading and saving can be achieved via either the load/save or jdbc methods
# Loading data from a JDBC source
jdbcDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "schema.tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .load()

jdbcDF2 = spark.read \
    .jdbc("jdbc:postgresql:dbserver", "schema.tablename",
          properties={"user": "username", "password": "password"})

# Specifying dataframe column data types on read
jdbcDF3 = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "schema.tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .option("customSchema", "id DECIMAL(38, 0), name STRING") \
    .load()

# Saving data to a JDBC source
jdbcDF.write \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "schema.tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .save()

jdbcDF2.write \
    .jdbc("jdbc:postgresql:dbserver", "schema.tablename",
          properties={"user": "username", "password": "password"})

# Specifying create table column data types on write
jdbcDF.write \
    .option("createTableColumnTypes", "name CHAR(64), comments VARCHAR(1024)") \
    .jdbc("jdbc:postgresql:dbserver", "schema.tablename",
          properties={"user": "username", "password": "password"})
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/python/sql/datasource.py」にあります。
// Note: JDBC loading and saving can be achieved via either the load/save or jdbc methods
// Loading data from a JDBC source
val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load()

val connectionProperties = new Properties()
connectionProperties.put("user", "username")
connectionProperties.put("password", "password")
val jdbcDF2 = spark.read
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)
// Specifying the custom data types of the read schema
connectionProperties.put("customSchema", "id DECIMAL(38, 0), name STRING")
val jdbcDF3 = spark.read
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)

// Saving data to a JDBC source
jdbcDF.write
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .save()

jdbcDF2.write
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)

// Specifying create table column data types on write
jdbcDF.write
  .option("createTableColumnTypes", "name CHAR(64), comments VARCHAR(1024)")
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/scala/org/apache/spark/examples/sql/SQLDataSourceExample.scala」にあります。
// Note: JDBC loading and saving can be achieved via either the load/save or jdbc methods
// Loading data from a JDBC source
Dataset<Row> jdbcDF = spark.read()
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load();

Properties connectionProperties = new Properties();
connectionProperties.put("user", "username");
connectionProperties.put("password", "password");
Dataset<Row> jdbcDF2 = spark.read()
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);

// Saving data to a JDBC source
jdbcDF.write()
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .save();

jdbcDF2.write()
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);

// Specifying create table column data types on write
jdbcDF.write()
  .option("createTableColumnTypes", "name CHAR(64), comments VARCHAR(1024)")
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/java/org/apache/spark/examples/sql/JavaSQLDataSourceExample.java」にあります。
# Loading data from a JDBC source
df <- read.jdbc("jdbc:postgresql:dbserver", "schema.tablename", user = "username", password = "password")

# Saving data to a JDBC source
write.jdbc(df, "jdbc:postgresql:dbserver", "schema.tablename", user = "username", password = "password")
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/r/RSparkSQLExample.R」にあります。
CREATE TEMPORARY VIEW jdbcTable
USING org.apache.spark.sql.jdbc
OPTIONS (
  url "jdbc:postgresql:dbserver",
  dbtable "schema.tablename",
  user 'username',
  password 'password'
)

INSERT INTO TABLE jdbcTable
SELECT * FROM resultTable

データ型マッピング

MySQL からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと MySQL Connector/J をアクティブな JDBC ドライバーとして使用して MySQL テーブルからデータを読み取る際に、MySQL データ型から Spark SQL データ型へのデータ型変換を示しています。Maria Connector/J など、MySQL に接続するために利用可能な異なる JDBC ドライバーでは、マッピングルールが異なる場合があることに注意してください。

MySQL データ型 Spark SQL データ型 備考
BIT(1) BooleanType
BIT( >1 ) BinaryType (デフォルト)
BIT( >1 ) LongType spark.sql.legacy.mysql.bitArrayMapping.enabled=true
TINYINT(1) BooleanType
TINYINT(1) ByteType tinyInt1isBit=false
BOOLEAN BooleanType
BOOLEAN ByteType tinyInt1isBit=false
TINYINT( >1 ) ByteType
TINYINT( any ) UNSIGNED ShortType
SMALLINT ShortType
SMALLINT UNSIGNED IntegerType
MEDIUMINT [UNSIGNED] IntegerType
INT IntegerType
INT UNSIGNED LongType
BIGINT LongType
BIGINT UNSIGNED DecimalType(20,0)
FLOAT FloatType
FLOAT UNSIGNED DoubleType
DOUBLE [UNSIGNED] DoubleType
DECIMAL(p,s) [UNSIGNED] DecimalType(min(38, p),(min(18,s))) 列型は DecimalType(38, 18) に制限されます。'p>38' の場合、小数部が 38 を超えると切り捨てられます。また、この列の値の実際の精度が 38 を超える場合は、NUMERIC_VALUE_OUT_OF_RANGE.WITHOUT_SUGGESTION エラーで失敗します。
DATE DateType
DATETIME TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
DATETIME TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
TIMESTAMP TimestampType
TIME TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIME TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
YEAR DateType yearIsDateType=true
YEAR IntegerType yearIsDateType=false
CHAR(n) CharType(n)
VARCHAR(n) VarcharType(n)
BINARY(n) BinaryType
VARBINARY(n) BinaryType
CHAR(n) BINARY BinaryType
VARCHAR(n) BINARY BinaryType
BLOB BinaryType
TINYBLOB BinaryType
MEDIUMBLOB BinaryType
LONGBLOB BinaryType
TEXT StringType
TINYTEXT StringType
MEDIUMTEXT StringType
LONGTEXT StringType
JSON StringType
GEOMETRY BinaryType
ENUM CharType(n)
SET CharType(n)

MySQL への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと MySQL Connector/J をアクティブな JDBC ドライバーとして使用して MySQL テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から MySQL データ型へのデータ型変換を示しています。

Maria Connector/J など、MySQL に接続するために利用可能な異なる JDBC ドライバーでは、マッピングルールが異なる場合があることに注意してください。

Spark SQL データ型 MySQL データ型 備考
BooleanType BIT(1)
ByteType TINYINT
ShortType SMALLINT Spark 3.5 以前は、INTEGER にマッピングされます。
IntegerType INTEGER
LongType BIGINT
FloatType FLOAT
DoubleType DOUBLE PRECISION
DecimalType(p, s) DECIMAL(p,s)
DateType DATE
TimestampType TIMESTAMP
TimestampNTZType DATETIME
StringType LONGTEXT
BinaryType BLOB
CharType(n) CHAR(n)
VarcharType(n) VARCHAR(n)

以下の Spark Catalyst データ型は、適切な MySQL 型ではサポートされていません。

PostgreSQL からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと PostgreSQL JDBC Driver をアクティブな JDBC ドライバーとして使用して PostgreSQL テーブルからデータを読み取る際に、PostgreSQL データ型から Spark SQL データ型へのデータ型変換を示しています。異なる JDBC ドライバーや異なるバージョンでは、わずかに異なる結果になる場合があることに注意してください。

PostgreSQL データ型 Spark SQL データ型 備考
boolean BooleanType
smallint, smallserial ShortType
integer, serial IntegerType
bigint, bigserial LongType
float, float(p), real FloatType 1 ≤ p ≤ 24
float(p) DoubleType 25 ≤ p ≤ 53
double precision DoubleType
numeric, decimal DecimalType
  • PostgreSQL 15 以降、's' は負になることがあります。's<0' の場合、DecimalType(min(p-s, 38), 0) に調整されます。それ以外の場合、DecimalType(p, s) になります。
  • 'p>38' の場合、小数部が 38 を超えると切り捨てられます。また、この列の値の実際の精度が 38 を超える場合は、NUMERIC_VALUE_OUT_OF_RANGE.WITHOUT_SUGGESTION エラーで失敗します。
  • 特殊な数値('NaN'、'infinity'、'-infinity')はサポートされていません。
character varying(n), varchar(n) VarcharType(n)
character(n), char(n), bpchar(n) CharType(n)
bpchar StringType
text StringType
bytea BinaryType
date DateType
timestamp [ (p) ] [ without time zone ] TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
timestamp [ (p) ] [ without time zone ] TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
timestamp [ (p) ] with time zone TimestampType
time [ (p) ] [ without time zone ] TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
time [ (p) ] [ without time zone ] TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
time [ (p) ] with time zone TimestampType
interval [ fields ] [ (p) ] StringType
ENUM StringType
money StringType 通貨型
inet, cidr, macaddr, macaddr8 StringType ネットワークアドレス型
point, line, lseg, box, path, polygon, circle StringType 幾何型
pg_lsn StringType ログシーケンス番号
bit, bit(1) BooleanType
bit( >1 ) BinaryType
bit varying( any ) BinaryType
tsvector, tsquery StringType テキスト検索型
uuid StringType Universally Unique Identifier Type
xml StringType XML 型
json, jsonb StringType JSON 型
array ArrayType
複合型 StringType CREATE TYPE 構文で作成された型。
int4range, int8range, numrange, tsrange, tstzrange, daterange など StringType 範囲型
ドメイン型 (基になる型によって決定される)
oid DecimalType(20, 0) オブジェクト識別子型
regxxx StringType オブジェクト識別子型
void NullType void は Postgres の疑似型です。その他の疑似型はまだ検証されていません。

PostgreSQL への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと PostgreSQL JDBC Driver をアクティブな JDBC ドライバーとして使用して PostgreSQL テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から PostgreSQL データ型へのデータ型変換を示しています。

Spark SQL データ型 PostgreSQL データ型 備考
BooleanType boolean
ByteType smallint
ShortType smallint
IntegerType integer
LongType bigint
FloatType float4
DoubleType float8
DecimalType(p, s) numeric(p,s)
DateType date
TimestampType timestamp with time zone Spark 4.0 より前は、timestamp にマッピングされていました。詳細については、移行ガイドを参照してください。
TimestampNTZType timestamp
StringType text
BinaryType bytea
CharType(n) CHAR(n)
VarcharType(n) VARCHAR(n)
ArrayType
要素型 PG Array
BooleanType boolean[]
ByteType smallint[]
ShortType smallint[]
IntegerType integer[]
LongType bigint[]
FloatType float4[]
DoubleType float8[]
DecimalType(p, s) numeric(p,s)[]
DateType date[]
TimestampType timestamp[]
TimestampNTZType timestamp[]
StringType text[]
BinaryType bytea[]
CharType(n) char(n)[]
VarcharType(n) varchar(n)[]
要素型が ArrayType の場合、Postgres 多次元配列に変換されます。
例:
ArrayType(ArrayType(StringType))text[][] に変換されます。
ArrayType(ArrayType(ArrayType(LongType)))bigint[][][] に変換されます。

以下の Spark Catalyst データ型は、適切な PostgreSQL 型ではサポートされていません。

Oracle からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと Oracle JDBC をアクティブな JDBC ドライバーとして使用して Oracle テーブルからデータを読み取る際に、Oracle データ型から Spark SQL データ型へのデータ型変換を示しています。

Oracle データ型 Spark SQL データ型 備考
BOOLEAN BooleanType Oracle Release 23c 以降で導入
NUMBER[(p[,s])] DecimalType(p,s) 's' は Oracle では負になることがあります。's<0' の場合、DecimalType(min(p-s, 38), 0) に調整されます。それ以外の場合、DecimalType(p, s) になり、'p>38' の場合、小数部が 38 を超えると切り捨てられます。また、この列の値の実際の精度が 38 を超える場合は、NUMERIC_VALUE_OUT_OF_RANGE.WITHOUT_SUGGESTION エラーで失敗します。
FLOAT[(p)] DecimalType(38, 10)
BINARY_FLOAT FloatType
BINARY_DOUBLE DoubleType
LONG BinaryType
RAW(size) BinaryType
LONG RAW BinaryType
DATE TimestampType oracle.jdbc.mapDateToTimestamp=true の場合、以下の TIMESTAMP の動作に従います。
DATE DateType oracle.jdbc.mapDateToTimestamp=false の場合、DateType にマッピングされます。
TIMESTAMP TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIMESTAMP TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
TIMESTAMP WITH TIME ZONE TimestampType
TIMESTAMP WITH LOCAL TIME ZONE TimestampType
INTERVAL YEAR TO MONTH YearMonthIntervalType
INTERVAL DAY TO SECOND DayTimeIntervalType
CHAR[(size [BYTE | CHAR])] CharType(size)
NCHAR[(size)] StringType
VARCHAR2(size [BYTE | CHAR]) VarcharType(size)
NVARCHAR2 StringType
ROWID/UROWID StringType
CLOB StringType
NCLOB StringType
BLOB BinaryType
BFILE UNRECOGNIZED_SQL_TYPE エラーが発生します。

Oracle への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと Oracle JDBC をアクティブな JDBC ドライバーとして使用して Oracle テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から Oracle データ型へのデータ型変換を示しています。

Spark SQL データ型 Oracle データ型 備考
BooleanType NUMBER(1, 0) BooleanType は NUMBER(1, 0) にマッピングされます。BOOLEAN は Oracle Release 23c 以降で導入されたためです。
ByteType NUMBER(3)
ShortType NUMBER(5)
IntegerType NUMBER(10)
LongType NUMBER(19)
FloatType NUMBER(19, 4)
DoubleType NUMBER(19, 4)
DecimalType(p, s) NUMBER(p,s)
DateType DATE
TimestampType TIMESTAMP WITH LOCAL TIME ZONE
TimestampNTZType TIMESTAMP
StringType VARCHAR2(255) 履歴上の理由により、文字列値は最大 255 文字です。
BinaryType BLOB
CharType(n) CHAR(n)
VarcharType(n) VARCHAR2(n)

以下の Spark Catalyst データ型は、適切な Oracle 型ではサポートされていません。

Microsoft SQL Server からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと mssql-jdbc をアクティブな JDBC ドライバーとして使用して Microsoft SQL Server テーブルからデータを読み取る際に、Microsoft SQL Server データ型から Spark SQL データ型へのデータ型変換を示しています。

SQL Server データ型 Spark SQL データ型 備考
bit BooleanType
tinyint ShortType
smallint ShortType
int IntegerType
bigint LongType
float(p), real FloatType 1 ≤ p ≤ 24
float[(p)] DoubleType 25 ≤ p ≤ 53
double precision DoubleType
smallmoney DecimalType(10, 4)
money DecimalType(19, 4)
decimal[(p[, s])], numeric[(p[, s])] DecimalType(p, s)
date DateType
datetime TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
datetime TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
datetime2 [ (fractional seconds precision) ] TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
datetime2 [ (fractional seconds precision) ] TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
datetimeoffset [ (fractional seconds precision) ] TimestampType
smalldatetime TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
smalldatetime TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
time [ (fractional second scale) ] TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
time [ (fractional second scale) ] TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
binary [ ( n ) ] BinaryType
varbinary [ ( n | max ) ] BinaryType
char [ ( n ) ] CharType(n)
varchar [ ( n | max ) ] VarcharType(n)
nchar [ ( n ) ] StringType
nvarchar [ ( n | max ) ] StringType
text StringType
ntext StringType
image StringType
geography BinaryType
geometry BinaryType
rowversion BinaryType
sql_variant UNRECOGNIZED_SQL_TYPE エラーが発生します。

Microsoft SQL Server への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと mssql-jdbc をアクティブな JDBC ドライバーとして使用して Microsoft SQL Server テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から Microsoft SQL Server データ型へのデータ型変換を示しています。

Spark SQL データ型 SQL Server データ型 備考
BooleanType bit
ByteType smallint Spark 4.0.0 以降でサポート。以前のバージョンはエラーを発生させます。
ShortType smallint
IntegerType int
LongType bigint
FloatType real
DoubleType double precision
DecimalType(p, s) number(p,s)
DateType date
TimestampType datetime
TimestampNTZType datetime
StringType nvarchar(max)
BinaryType varbinary(max)
CharType(n) char(n)
VarcharType(n) varchar(n)

以下の Spark Catalyst データ型は、適切な SQL Server 型ではサポートされていません。

DB2 からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと IBM Data Server Driver For JDBC and SQLJ をアクティブな JDBC ドライバーとして使用して DB2 テーブルからデータを読み取る際に、DB2 データ型から Spark SQL データ型へのデータ型変換を示しています。

DB2 データ型 Spark SQL データ型 備考
BOOLEAN BinaryType
SMALLINT ShortType
INTEGER IntegerType
BIGINT LongType
REAL FloatType
DOUBLE, FLOAT DoubleType FLOAT は db2 では倍精度浮動小数点数です。
DECIMAL, NUMERIC, DECFLOAT DecimalType
DATE DateType
TIMESTAMP, TIMESTAMP WITHOUT TIME ZONE TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIMESTAMP, TIMESTAMP WITHOUT TIME ZONE TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
TIMESTAMP WITH TIME ZONE TimestampType
TIME TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIME TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
CHAR(n) CharType(n)
VARCHAR(n) VarcharType(n)
CHAR(n) FOR BIT DATA BinaryType
VARCHAR(n) FOR BIT DATA BinaryType
BINARY(n) BinaryType
VARBINARY(n) BinaryType
CLOB(n) StringType
DBCLOB(n) StringType
BLOB(n) BinaryType
GRAPHIC(n) StringType
VARGRAPHIC(n) StringType
XML StringType
ROWID StringType

DB2 への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと IBM Data Server Driver For JDBC and SQLJ をアクティブな JDBC ドライバーとして使用して DB2 テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から DB2 データ型へのデータ型変換を示しています。

Spark SQL データ型 DB2 データ型 備考
BooleanType BOOLEAN
ByteType SMALLINT
ShortType SMALLINT
IntegerType INTEGER
LongType BIGINT
FloatType REAL
DoubleType DOUBLE PRECISION
DecimalType(p, s) DECIMAL(p,s) 'p' の最大値は DB2 では 31 ですが、Spark では 38 です。DecimalType(p>=32, s) を DB2 に保存しようとすると失敗する可能性があります。
DateType DATE
TimestampType TIMESTAMP
TimestampNTZType TIMESTAMP
StringType CLOB
BinaryType BLOB
CharType(n) CHAR(n) 'n' の最大値は DB2 では 255 ですが、Spark では無制限です。
VarcharType(n) VARCHAR(n) 'n' の最大値は DB2 では 255 ですが、Spark では無制限です。

以下の Spark Catalyst データ型は、適切な DB2 型ではサポートされていません。

Teradata からの Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと Teradata JDBC Driver をアクティブな JDBC ドライバーとして使用して Teradata テーブルからデータを読み取る際に、Teradata データ型から Spark SQL データ型へのデータ型変換を示しています。

Teradata データ型 Spark SQL データ型 備考
BYTEINT ByteType
SMALLINT ShortType
INTEGER, INT IntegerType
BIGINT LongType
REAL, DOUBLE PRECISION, FLOAT DoubleType
DECIMAL, NUMERIC, NUMBER DecimalType
DATE DateType
TIMESTAMP, TIMESTAMP WITH TIME ZONE TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIMESTAMP, TIMESTAMP WITH TIME ZONE TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
TIME, TIME WITH TIME ZONE TimestampType (デフォルト)preferTimestampNTZ=false または spark.sql.timestampType=TIMESTAMP_LTZ
TIME, TIME WITH TIME ZONE TimestampNTZType preferTimestampNTZ=true または spark.sql.timestampType=TIMESTAMP_NTZ
CHARACTER(n), CHAR(n), GRAPHIC(n) CharType(n)
VARCHAR(n), VARGRAPHIC(n) VarcharType(n)
BYTE(n), VARBYTE(n) BinaryType
CLOB StringType
BLOB BinaryType
INTERVAL Data Types - INTERVAL データ型はまだ不明です。
Period Data Types, ARRAY, UDT - サポートされていません

Teradata への Spark SQL データ型のマッピング

以下の表は、組み込みの jdbc データソースと Teradata JDBC Driver をアクティブな JDBC ドライバーとして使用して Teradata テーブルにデータを作成、変更、または書き込む際に、Spark SQL データ型から Teradata データ型へのデータ型変換を示しています。

Spark SQL データ型 Teradata データ型 備考
BooleanType CHAR(1)
ByteType BYTEINT
ShortType SMALLINT
IntegerType INTEGER
LongType BIGINT
FloatType REAL
DoubleType DOUBLE PRECISION
DecimalType(p, s) DECIMAL(p,s)
DateType DATE
TimestampType TIMESTAMP
TimestampNTZType TIMESTAMP
StringType VARCHAR(255)
BinaryType BLOB
CharType(n) CHAR(n)
VarcharType(n) VARCHAR(n)

以下の Spark Catalyst データ型は、適切な Teradata 型ではサポートされていません。