コンテンツにスキップ

データマッパーの高度な機能に進む前に、基本的な機能を簡単に復習しておきましょう。

データマッパーは、ソースデータの列をターゲットのデータテーブルにマッピングするために使用します。

ソースを検査メニューボタンを使うと、ソースからターゲットへ列をマッピングする方法が追加で用意されています。

  • 両方のマッピングテーブルを入力: ソースデータテーブルのすべての値をターゲットのデータテーブルに反映します。これがデフォルトです。
  • ソースマッピングテーブルのみを入力: ソースデータテーブルのすべての値のみをマッピングします。ソース列の構造が変わったときに、既存のワークフローを修正する場合に便利です。
  • ターゲットマッピングテーブルのみを入力: すべての値をターゲットのデータテーブルにのみ反映します。

ソース列とターゲット列のオプションだけでは足りない場合は、次のようないくつかの方法で、ターゲットのデータテーブルに他の列を追加できます。

  • すべてを反映は、すでに存在するかどうかにかかわらず、すべてのソース列をターゲットのデータテーブルに挿入します。
  • 選択を反映は、選択したソース列のみを挿入します。
  • ターゲット側を右クリックして行を挿入を選択すると、現在選択している行の直前に行を挿入します。
  • ターゲット側を右クリックして行を追加を選択すると、ターゲットのデータテーブルの末尾(右端)に行を挿入します。

ターゲットのデータテーブルから列を削除するには、削除する列を選択し、右クリックして削除を選択します。

ターゲットのデータテーブルで列を並べ替えるには、対象の列を選択します。次のいずれかを使用できます。

  • 一括移動の矢印: 右上の矢印から、目的の移動オプションを選択します。
  • コンテキストメニュー: 右クリックして、先頭へ移動、上へ移動、下へ移動、末尾へ移動のいずれかを選択します。

結果を重複のないレコードのみに絞り込む

Section titled “結果を重複のないレコードのみに絞り込む”

重複のない結果のみを返すには、重複排除メニューオプションを選択します。ソースの各列にチェックボックスが表示されます。重複のない結果のみを返したい列の横にあるチェックボックスをオンにするだけです。

結果を集計するには、集計メニューオプションを選択します。ターゲットのデータテーブルの各列に選択ボックスが表示されます。各列に適切な集計方法を選択してください。

ソース列cust_idamtdtnoteターゲット列customer_idamountorder_date名前の変更キャスト → decimal名前の変更未マッピング → 除外
マッパーは、各ソース列をターゲット列に接続し、その過程で名前の変更や型のキャストを行います。マッピングされないソース列は結果から除外されます。

結果を集計するには、集計メニューオプションを選択します。ターゲットのデータテーブルの各列に選択ボックスが表示されます。次の集計オプションを使用できます。

関数 説明
グループ化 値で結果をグループ化します
件数 グループ内のnullでない観測値の数
件数(nullを含む) グループ内の観測値の数
合計 グループ内の値の合計
平均 グループ内の値の平均
中央値 グループ内の値の中央値
最頻値 グループ内の値の最頻値
最小 グループ内の値の最小値
最大 グループ内の値の最大値
最初 ソート順におけるグループ内の最初の値
最後 ソート順におけるグループ内の最後の値
標準偏差 グループ内の不偏標準偏差
標本標準偏差 グループ内の標本標準偏差
母標準偏差 グループ内の母標準偏差
分散 グループ内の不偏分散
標本分散 グループ内の標本分散
母分散 グループ内の母分散
グループ化以外の詳細 ウィンドウ関数を使用する場合の特別な集計の選択肢

列に適切な集計方法を選択してください。

RESTとAIアシスタント向けの集計キー

Section titled “RESTとAIアシスタント向けの集計キー”

REST APIまたはAIアシスタントでステップを設定する場合、各ターゲット列はaggに集計方法を持ち、ステップのaggregation_typeが同じ選択肢を指定します。データマッパーを持つすべてのステップが、次の値を受け付けます。

キー 集計
group グループ化
dont_group グループ化以外の詳細: 列はグループ化も集計もされません。式自体が集計またはウィンドウ処理を行う場合に使用します
count グループ内のnullでない観測値の数
count_null nullを含む件数
count_distinct グループ内の異なる値の数
sum 合計
avg 平均
median 中央値
min 最小
max 最大
stddev 標準偏差
stddev_samp 標本標準偏差
stddev_pop 母標準偏差
variance 分散
var_samp 標本分散

各ターゲット列にはsortを指定できます。asc、desc、noneのいずれか、またはオブジェクト{ascending, order}です。ascendingはtrueまたはfalseです。orderはキーの優先順位を決める整数です。orderを持つ列が先にソートされ、番号の小さいものが先になります。その後に、残りのソート対象列が列の位置順に続きます。

ウィンドウ関数を使用する場合は、集計方法としてグループ化以外の詳細を選択します。ウィンドウ関数にはすでに集計が内在しているため、この特別な選択が必要です。

定数列に値を指定すると、ソース列の値が指定されていても、それを上書きして、列に指定した定数値を設定します。

ターゲット列は、次の優先順位で、入力されたもののうちいずれかから値を取得します。定数が最優先で、次に式、最後にソース列です。

そのため、値を計算する列にはソースは不要です。定数や式を指定する場合は空欄にしてください。定数や式がすでに値を定めているため、併せて指定したソースは無視されます。受信データから列をそのままマッピングする場合、名前を変更する場合、または途中で型をキャストする場合は、ソースを入力します。

式は、ソースセルではなく、get_column(table, 'Column Name')を使って、受信列を名前で読み取ります。

データマッパーには、列内のデータに変換を適用するための、ポイントアンドクリックで使える便利なクリーナー機能があります。

クリーニング操作には、次のカテゴリがあります。

  • テキストのトリム
  • テキストの書式設定
  • テキスト変換
  • NULL値との相互変換
  • 数値書式
  • 日付の解析

クリーナーで選択した内容は、1つの式にまとめて変換され、式の情報で確認できます。

データマッパーの式は、PlaidCloudで最も強力で柔軟な概念の1つです。非常に大きなデータでも優れたパフォーマンスを発揮しながら、ほぼ無制限の柔軟性を提供します。

式は、Python SQLAlchemyの構文と、PlaidCloudで利用できるいくつかの追加ヘルパー関数を使って記述します。 これにより、PlaidCloudは基盤となるデータウェアハウス(Greenplum、SAP HANA、Redshiftなど)の機能一式を直接利用できます。さらに、SQLAlchemyの操作に関するクイックリファレンスが公開されており、数多く入手できます。標準のSQLAlchemy構文を使うことで、PlaidCloudは、また新たなドメイン固有の構文を作ってしまうというよくある落とし穴を避けています。

式エディターは、列の式セルをダブルクリックして開きます。開くと、左側に列の一覧、右側に豊富な関数ライブラリが表示されます。

式を直接エディターに入力することも十分可能ですが、通常は、ポイントアンドクリックで関数と列を選択して始めるほうが簡単です。関数ライブラリには、次のグループがあります。

  • 条件
  • 列固有の条件
  • 変換
  • 日付
  • 数学
  • テキスト
  • 集計
  • ウィンドウ関数の操作
  • 配列
  • JSON
  • PostGIS(地理空間)
  • 三角関数

式が完成したら、保存すると列に適用されます。

例と式の関数については、式のセクションを参照してください。

cast(x, Float)は、どのウェアハウスでも64ビットの倍精度数を返すため、1225541207.71のような金額もすべての桁が保持されます。StarRocksでは、以前はスキップされていたFloatへのキャストが適用されるようになり、Databendでは単精度ではなく倍精度になります。PlaidCloudがfloatデータから作成するFloat列も倍精度です。単精度の列を持つ既存のテーブルは、次にステップが上書きでテーブルを再構築した時点で、倍精度になります。

StarRocksでは、次のとおりです。

  • 大きな整数へのキャストでは、約21億を超える値を保持できます。
  • 精度を指定しないNumericへのキャストでは、整数に丸められず、最大10桁までの小数が保持されます。
  • JSONへのキャストが適用されます。

どのウェアハウスでも、数値以外のテキストを数値にキャストする場合のように、変換できない値は、ステップを停止させずにnullになります。

式から別のテーブルを読み取る

Section titled “式から別のテーブルを読み取る”

sqlalchemy.literal_columnは、SQLの断片をウェアハウスにそのまま渡します。受け付けるのは、列、計算、CASE、関数呼び出し、キャスト、ウィンドウ関数など、単一の値です。サブクエリ((SELECT ... FROM ...))を含むliteral_columnは、ステップが宣言していないテーブルにアクセスしてしまうため、拒否されます。

このセクションのルールは、式がどこで記述されても適用されます。ここでのマッパー、ステップのフィルター、別の場所で組み立ててプラットフォームに送信されるクエリのいずれも対象です。ルールは、ステップの保存時と、式がSQLに変換される際に再度チェックされます。

代わりにsqlalchemy.select(...)でサブクエリを構築してください。列に単一の値が必要な場合は.scalar_subquery()、サブクエリから選択する場合は.subquery()を使用します。

# Refused
sqlalchemy.literal_column('(SELECT rate FROM fx WHERE fx.cc = t.cc)')
# Supported — a single value in a column
sqlalchemy.select(fx.c.rate).where(fx.c.cc == t.c.cc).scalar_subquery()
# Supported — a table to select from
sqlalchemy.select(fx.c.rate).subquery()

最も外側の演算子がORであるliteral_columnも拒否されます。PlaidCloudはテキストをそのまま渡すため、その後に追加された条件は、全体の半分にしか結び付きません。a OR bの後にAND region = 'East'が続くと、a OR (b AND region = 'East')として解釈され、除外するつもりだった行が返されてしまいます。

括弧を追加すれば、これまでどおり動作します。

# Refused
sqlalchemy.literal_column("status = 'open' OR status = 'pending'")
# Supported
sqlalchemy.literal_column("(status = 'open' OR status = 'pending')")

式の内側にある論理和(CASE内にあるもの、またはすでに括弧で囲まれているもの)には影響しません。

XORは、括弧の有無にかかわらず、どこにあっても拒否されます。ウェアハウスによって結合の強さの扱いが異なるため、すべての環境で安全な解釈がないからです。代わりに、(a AND NOT b) OR (NOT a AND b)のように展開して記述してください。

コメントを含むliteral_columnも、同じ理由で拒否されます。コメントはステートメントの末尾まで続くため、記述した部分だけでなく、PlaidCloudが式の後ろに追加する内容まで消してしまうからです。

--は、ステートメントの残りの部分に及ぶ場合に拒否されます。#は、例外なくテキスト内のどこにあっても拒否されます。引用符で囲まれた文字列の内部や、Postgresの#>および#>> JSONパス演算子も含まれます。

# Refused
sqlalchemy.literal_column("attrs #> '{a,b}'")
sqlalchemy.literal_column("code || '#'")

#は、StarRocksなどのMySQL互換ウェアハウスではコメントの開始になります。また、式を記述する時点では、PlaidCloudはどのウェアハウスが式を実行するかを把握していません。そのため、テキスト内に確実に安全な位置はなく、あるエンジンでは引用符で囲まれているように見える#が、別のエンジンではコメントの開始になります。この文字をデータとして必要な場合は、値として渡してください。

# Supported
sqlalchemy.func.concat(table.code, sqlalchemy.literal('#'))

.op('...')でも、同じ2つの記述が拒否されます。

literal_columnが通常使われるその他の用途には影響しません。literal_column('current_date')、literal_column("CASE WHEN amount > 0 THEN 'p' ELSE 'n' END")、func.count()は、これまでどおりすべて動作します。スペース、ドット、引用符を含む列名にも影響しません。ウェアハウスが自動的に引用符で囲みます。