セットアップの詳細
ユーザーとロールの管理
default ユーザーの使用は避け、この Fivetran 宛先専用のユーザーを別途作成することをおすすめします。以下のコマンドを default ユーザーで実行すると、必要な権限を持つ新しい fivetran_user が作成されます。
fivetran_user の特定のデータベースへのアクセス権を取り消すこともできます。
たとえば、次のステートメントを実行すると、default データベースへのアクセスが制限されます。
高度な設定
この設定は完全にオプションです。ファイルをアップロードしない場合、宛先ではほとんどのユースケースで適切に機能する妥当なデフォルト値が使用されます。
すべてのフィールドは省略可能です。フィールドが指定されていない場合は、デフォルト値が使用されます。
値が許容範囲外の場合、宛先は同期中にエラーを報告します。
不明なフィールドは黙って無視され (警告はログに記録されます) 、エラーにはなりません。これにより、新しい設定が追加された場合でも前方互換性を確保できます。
例:
型変換マッピング
- BINARY、XML、LOCALTIME、JSON は、ClickHouse の
String型で任意のバイト列を表現できるため、String として保存されます。宛先では、元のデータ型を示すためにカラム comment が追加されます。ClickHouse の JSON データ型は、廃止されたものとされており、本番環境での使用は一度も推奨されていないため、使用されません。 ** 注: LOCALTIME 型のサポート状況を追跡する Issue: clickhouse-fivetran-destination #15。
日付および時刻の値の範囲
- INSTANT の上限が 2262-04-11 23:47:16 である理由は、DateTime64(9) が epoch からのナノ秒を int64 として格納しており、2^63 - 1 ナノ秒がこの日時に相当するためです。 ClickHouse 自体は、精度 <= 9 の DateTime64 を 2299-12-31 23:59:59 までサポートしています。
- LOCALDATETIME の上限も、Go の ClickHouse ドライバーにある 既知のバグ により、2262-04-11 23:47:16 に制限されます。このバグでは、スケーリング前にすべての DateTime64 精度に対して
time.Time.UnixNano()が呼び出されるため、精度 0 であっても 2262 年以降の日付で int64 overflow が発生します。
宛先テーブル
SharedReplacingMergeTree) を使用し、_fivetran_synced カラムでバージョン管理を行います。
プライマリ (並び順) キーおよび Fivetran のメタデータカラムを除くすべてのカラムは、
Nullable(T) として作成されます。ここで T は、
data types mapping に基づく ClickHouse Cloud のデータ型です。
テーブル構造は、コネクタに設定された Fivetran の
sync mode
(soft delete (デフォルト) または history mode (SCD Type 2) ) に応じて異なります。
ソフト削除モード
ソーステーブルに主キーが1つある場合
users には、主キーカラム id (INT) と通常のカラム name (STRING) があります。
宛先テーブルは次のように定義されます。
id カラムがテーブルのソートキーとして選択されます。
ソーステーブルに複数の主キーがある場合
items に主キーカラム id (INT) と name (STRING) があり、さらに
通常のカラム description (STRING) があるとします。宛先テーブルは次のように定義されます。
id と name のカラムがテーブルのソートキーとして選択されます。
ソーステーブルに主キーがない場合
_fivetran_id カラムとして追加されます。
ソースの events テーブルに、event (STRING) と timestamp (LOCALDATETIME) のカラムしかない場合を考えてみましょう。
この場合の宛先テーブルは次のとおりです。
_fivetran_id は一意で、他に主キーの選択肢がないため、テーブルのソートキーに使用されます。
History mode (SCD Type 2)
_fivetran_start カラムは、複合ソートキーの最後の要素として、常に ORDER BY 句に含まれます。
これにより、同じレコードの複数のバージョン (開始時刻が異なるもの) をテーブル内に共存させることができます。
レコードが更新されると、次のようになります。
- 以前のバージョンの
_fivetran_endは、新しいバージョンの_fivetran_startから 1 ナノ秒引いた値に設定され、_fivetran_activeはfalseに設定されます。 - 新しいバージョンは、
_fivetran_activeをtrueに、_fivetran_endを2262-04-11 23:47:16.000000000(DateTime64(9)の最大値) に設定して挿入されます。
ソーステーブルに単一の主キーがある場合
users には、主キーのカラム id (INT) と、通常のカラム name (STRING) および status (STRING) があります。
History Mode の宛先テーブルは次のように定義されます。
id と _fivetran_start が複合ソートキーを構成します。
数回同期すると、テーブルには次のようなデータが含まれる可能性があります。
レコード
id=1 には 2 つのバージョンがあります。元のもの (name 1、非アクティブ) と、更新後のもの (name 11、アクティブ) です。
レコード id=2 には 1 つのバージョンのみがあり、現在アクティブです。
ソーステーブルに複数の主キーがある場合
_fivetran_start とともに ORDER BY に含まれます。
たとえば、主キーカラム id (INT) と name (STRING) を持ち、さらに通常のカラム description (STRING) を持つソーステーブル items があるとします。History Mode の宛先テーブルは、次のように定義されます。
id、name、_fivetran_start が複合ソートキーとなります。
ソーステーブルに主キーがない場合
_fivetran_id カラムとして追加され、
_fivetran_start がソートキーに加えられます。
ソースに event (STRING) と timestamp (LOCALDATETIME) のカラムしかない events テーブルを考えてみましょう。
History Mode の宛先テーブルは以下のようになります。
_fivetran_id と _fivetran_start が複合ソートキーを構成しているためです。
重複のないデータの最新バージョンを選択する
SharedReplacingMergeTree は、バックグラウンドでデータの重複排除を
不明なタイミングで実行される merge 中にのみ
行います。
ただし、FINAL キーワードを使うことで、その場で重複のないデータの最新バージョンを選択できます。
ネットワーク障害時の再試行
SharedReplacingMergeTree テーブルエンジンで処理されるため、安全です。