JDBC から他のデータベースへ
- データソースオプション
- データ型マッピング
- MySQL からの Spark SQL データ型のマッピング
- MySQL への Spark SQL データ型のマッピング
- PostgreSQL からの Spark SQL データ型のマッピング
- PostgreSQL への Spark SQL データ型のマッピング
- Oracle からの Spark SQL データ型のマッピング
- Oracle への Spark SQL データ型のマッピング
- Microsoft SQL Server からの Spark SQL データ型のマッピング
- Microsoft SQL Server への Spark SQL データ型のマッピング
- DB2 からの Spark SQL データ型のマッピング
- DB2 への Spark SQL データ型のマッピング
- Teradata からの Spark SQL データ型のマッピング
- Teradata への Spark SQL データ型のマッピング
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 のデータソースオプションは、以下のように設定できます。
- DataFrameReader の
DataFrameReaderDataFrameWriter
- CREATE TABLE USING DATA_SOURCE の
OPTIONS句
接続プロパティについては、データソースオプションで 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このオプションを使用する際の制約をいくつか以下に示します。
|
読み込み |
prepareQuery |
(なし) | query と組み合わせて最終的なクエリを形成するプレフィックス。指定された query は FROM 句のサブクエリとして括弧で囲まれ、一部のデータベースはサブクエリですべての句をサポートしていないため、prepareQuery プロパティは、そのような複雑なクエリを実行する方法を提供します。例として、Spark は JDBC ソースに次のような形式のクエリを発行します。<prepareQuery> SELECT <columns> FROM (<user_specified_query>) spark_gen_alias以下にいくつかの例を示します。
|
読み書き |
driver |
(なし) | この URL に接続するために使用される JDBC ドライバーのクラス名。 | 読み書き |
partitionColumn, lowerBound, upperBound |
(なし) | これらのいずれかが指定された場合は、すべて指定する必要があります。さらに、numPartitions も指定する必要があります。これらは、複数のワーカーから並列で読み取る際のテーブルのパーティション分割方法を記述します。partitionColumn は、対象のテーブルの数値、日付、またはタイムスタンプの列である必要があります。lowerBound および upperBound はパーティションのストライドを決定するためだけに使用され、テーブル内の行をフィルタリングするためではないことに注意してください。したがって、テーブルのすべての行がパーティション分割され、返されます。このオプションは読み込みにのみ適用されます。例 spark.read.format("jdbc")
|
読み込み |
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 |
トランザクション分離レベル。現在の接続に適用されます。NONE、READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_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 が想定されます。keytab と principal の両方が定義されている場合、Spark は Kerberos 認証を試みます。 |
読み書き |
principal |
(なし) | JDBC クライアントの Kerberos プリンシパル名を指定します。keytab と principal の両方が定義されている場合、Spark は Kerberos 認証を試みます。 |
読み書き |
refreshKrb5Config |
false |
このオプションは、新しい接続を確立する前に、JDBC クライアントの Kerberos 構成をリフレッシュするかどうかを制御します。構成をリフレッシュしたい場合は true に設定し、それ以外の場合は false に設定します。デフォルト値は false です。このオプションを true に設定して複数の接続を確立しようとすると、競合状態が発生する可能性があることに注意してください。考えられる状況の 1 つは次のとおりです。
|
読み書き |
connectionProvider |
(なし) | この URL に接続するために使用される JDBC 接続プロバイダーの名前。例: db2、mssql。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 設定オプションを使用する前に、次の要件が満たされていることを確認してください。
- 含まれている JDBC ドライバーのバージョンが、keytab を使用した Kerberos 認証をサポートしている。
- 使用されているデータベースでサポートされている組み込み接続プロバイダーが存在する。
以下のデータベースには組み込み接続プロバイダーがあります。
- DB2
- MariaDB
- MS Sql
- Oracle
- PostgreSQL
要件が満たされていない場合は、カスタム認証を処理するために 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"})// 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)// 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);# 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")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 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType
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 |
|
| 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 |
|
要素型が ArrayType の場合、Postgres 多次元配列に変換されます。 例: ArrayType(ArrayType(StringType)) は text[][] に変換されます。ArrayType(ArrayType(ArrayType(LongType))) は bigint[][][] に変換されます。 |
以下の Spark Catalyst データ型は、適切な PostgreSQL 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType - 要素型が上記にリストされていない場合。
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType
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 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType
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 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType
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 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType
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 型ではサポートされていません。
- DayTimeIntervalType
- YearMonthIntervalType
- CalendarIntervalType
- ArrayType
- MapType
- StructType
- UserDefinedType
- NullType
- ObjectType
- VariantType