7.4. Debezium PostgreSQL コネクターによるデータ型のマッピング方法
PostgreMySQL コネクターは、行が存在するテーブルのように構造化されたイベントで行への変更を表します。イベントには、各列の値のフィールドが含まれます。その値がどのようにイベントで示されるかは、列の PostgreSQL のデータ型によって異なります。以下のセクションでは、PostgreSQL データ型をイベントフィールドの リテラル型 および セマンティック型にマッピングする方法を説明します。
-
リテラル型 は、Kafka Connect スキーマタイプ(INT
8
、INT16
、INT32
、INT64
、FLOAT32、
、FLOAT
64BOOLEAN
、STRING、BYTES、
および
STRUCT
)を使用して値を表す方法を記述します。 - セマンティック型 は、フィールドの Kafka Connect スキーマの名前を使用して、Kafka Connect スキーマがフィールドの 意味 をキャプチャーする方法を記述します。
詳細は以下を参照してください。
基本型
以下の表は、コネクターによる基本型へのマッピング方法を説明しています。
表7.8 PostgreSQL の基本データ型のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
| 該当なし |
|
| 該当なし |
|
|
|
|
|
|
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
| 該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 該当なし |
|
| 該当なし |
|
|
該当なし |
|
|
n/a |
|
|
n/a |
|
|
該当なし |
|
|
該当なし |
|
|
該当なし |
|
|
|
時間型
タイムゾーン情報が含まれる PostgreSQL の TIMESTAMP
データ型以外に、一時的な型がマッピングされる方法は、TZ
および TIMETZtime.precision.mode
コネクター設定プロパティーの値によって異なります。ここでは、以下のマッピングについて説明します。
time.precision.mode=adaptive
time.precision.mode
プロパティーが adaptive
に設定されている場合、コネクターは列のデータ型定義に基づいてリテラル型とセマンティック型を決定します。これにより、イベントがデータベースの値を 正確 に表すようになります。
表7.9 time.precision.mode
が 適応
した場合のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time.precision.mode=adaptive_time_microseconds
time.precision.mode
設定プロパティーが adaptive _time_microseconds
に設定されている場合、コネクターは列のデータ型定義に基づいて、時間型のリテラル型とセマンティック型を決定します。これにより、すべての TIME
フィールドがマイクロ秒としてキャプチャーされる場合を除き、イベントがデータベースの値を 正確 に 表す ようになります。
表7.10 time.precision.mode が adaptive
_time_microseconds
の場合のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
time.precision.mode=connect
time.precision.mode
設定プロパティーが connect
に設定されている場合、コネクターは Kafka Connect の論理型を使用します。これは、コンシューマーが組み込みの Kafka Connect の論理型のみを処理でき、可変精度の時間値を処理できない場合に便利です。ただし、PostgreSQL はマイクロ秒の精度をサポートするため、接続
時間 の精度モードでコネクターによって生成されたイベントは、データベース列の少数秒の精度値が 3 よりも大きい場合に、精度が失われます。
表7.11 time.precision.mode
が接続されている場合 のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
|
|
|
|
TIMESTAMP 型
TIMESTAMP
型は、タイムゾーン情報のないタイムスタンプを表します。このような列は、UTC を基にして同等の Kafka Connect 値に変換されます。たとえば、「 2018-06-20
15:13:16.945104」は、time.precision.
で表されます mode が '1529507596945104" の値の io.debezium.time.
MicroTimestamp。
Kafka Connect および Debezium を実行している JVM のタイムゾーンは、この変換には影響しません。
PostgreSQL は、TIMESTAMP
列での +/無限
の値の使用をサポートします。これらの特別な値は、正の infinity または -9223
のタイムスタンプに変換されます(負の値の場合)。この動作は、PostgreSQL JDBC ドライバーの標準的な動作と似ています。詳細は、372036832400000 の場合、92233720
36825200000org.postgresql.PGStatement
インターフェースを参照してください。
10 進数型
PostgreSQL コネクター設定プロパティーの設定は decimal.handling.mode
で、コネクターが 10 進数型をマッピングする方法を決定します。
decimal.handling.mode
プロパティーが exact に設定されている場合 、
コネクターはすべての DECI MAL
および NUMERIC
列に Kafka Connect org.apache.kafka.connect.data.Decimal
logical type を使用します。これがデフォルトのモードです。
表7.12 decimal.handling.mode
が正確に行われる場合のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
|
このルールには例外があります。NUMERIC
または DECIMAL
タイプをスケール制約なしで使用すると、データベースから送信される値には、値ごとに異なる(変数)スケールが設定されます。この場合、コネクターは io.debezium.data.VariableScaleDecimal
を使用します。これには、転送された値の値とスケールが含まれます。
表7.13 スケーリング制約がない場合の 10 進数型のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
|
decimal.handling.mode
プロパティーが double
に設定されている場合、コネクターはすべての DECI MAL
値および NUMERIC
値を Java の二重値として表し、以下の表で示すようにエンコードします。
表7.14 decimal.handling.mode
が double
の場合のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) |
---|---|---|
|
| |
|
|
decimal.handling.mode
設定プロパティーの可能な最後の設定は string
です。この場合、コネクターは DECI MAL
および NUMERIC
の値をフォーマットされた文字列表現として表し、それらを以下の表で示すようにエンコードします。
表7.15 decimal.handling.mode
が string
の場合のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) |
---|---|---|
|
| |
|
|
PostgreSQL は 、10 進数の設定が string
または
double
の場合に、DECI MAL
/NUMERIC
値に保存される特別な値として NaN
(数字ではない)をサポートします。この場合、コネクターは NaN
を Double.NaN
または文字列定数 NAN のいずれかとして
エンコードします。
HSTORE 型
hstore.handling.mode
コネクター設定プロパティーが json
(デフォルト)に設定されている場合、コネクターは HSTORE
の値を JSON 値の文字列表現として表し、それらを以下の表で示すようにエンコードします。hstore.handling.mode
プロパティーが map
に設定されている場合、コネクターは HSTORE
の値に MAP
スキーマタイプを使用します。
表7.16 HSTORE
データ型のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
|
|
|
該当なし |
ドメイン型
PostgreSQL は、他の基礎となるタイプに基づいたユーザー定義の型をサポートします。このような列型を使用すると、Debezium は完全な型階層に基づいて列の表現を公開します。
PostgreSQL ドメイン型を使用する列で変更をキャプチャーするには、特別に考慮する必要があります。デフォルトデータベース型の 1 つを拡張するドメインタイプと、カスタムの長さまたはスケールを定義するドメインタイプが含まれるように列が定義されると、生成されたスキーマは定義されたその長さとスケールを継承します。
カスタムの長さまたはスケールを定義するドメインタイプを拡張する別のドメインタイプが含まれるように列が定義されていると、その情報は PostgreSQL ドライバーの列メタデータにはないため、生成されたスキーマは定義された長さやスケールを継承 しません。
ネットワークアドレス型
PostgreSQL には、IPv4、IPv6、および MAC アドレスを保存できるデータ型があります。ネットワークアドレスの格納には、プレーンテキスト型ではなくこの型を使用することが推奨されます。ネットワークアドレス型は、入力エラーチェックと特化した演算子および関数を提供します。
表7.17 ネットワークアドレス型のマッピング
PostgreSQL のデータ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
該当なし |
|
|
該当なし |
|
|
該当なし |
|
|
該当なし |
PostGIS タイプ
PostgreSQL コネクターは、すべての PostGIS データ型 をサポートします。
表7.18 PostGIS データ型のマッピング
PostGIS データ型 | リテラル型 (スキーマ型) | セマンティック型 (スキーマ名) および注記 |
---|---|---|
|
|
詳細は、「Open Geospatial Consortium Simple Features Access」を参照してください。 |
|
|
詳細は、「Open Geospatial Consortium Simple Features Access」を参照してください。 |
TOAST 化された値
PostgreSQL ではページサイズにハード制限があります。つまり、約 8KB 以上の値は、TOAST ストレージを使って保存する必要があるのです。これは、データベースからのレプリケーションメッセージに影響します。TOAST メカニズムを使用して保存され、変更されていない値は、テーブルのレプリカ ID の一部でない限り、メッセージに含まれません。競合が発生する可能性があるため、Debezium が不足している値を直接データベースから読み取る安全な方法はありません。そのため、Debezium は以下のルールに従って、TOAST 化された値を処理します。
-
REPLICA IDENTITY FULL
: TOAST 列の値は、他の列と同様に変更イベントのフィールド
の一部になります。
-
REPLICA IDENTITY DEFAULT
のあるテーブル - データベースからUPDATE
イベントを受信する場合、レプリカ ID の一部ではない変更されていない TOAST 列値はイベントに含まれません。同様に、DELETE
イベントを受信するときに TOAST 列(ある場合)はbefore
フィールドに含まれません。この場合、Debezium は列値を安全に提供できないため、コネクターはコネクター設定プロパティーtoasted.value.placeholder
で定義されているプレースホルダー値を返します。