🧑‍🤝‍🧑

Dataformで同名のテーブルを複数作る

2023/12/08に公開

この記事はときは会アドベントカレンダーの7日目です。

Dataformを用いることで、多くのテーブルを簡単に取り扱えるようになります。その過程で同じテーブル名のテーブルを複数作成、管理したくなることがあるかもしれません。Dataformで同名テーブルを取り扱う際の注意点を自分用にまとめておきます。

同名テーブルを作成する準備

作成したいテーブルのSQLXやJSファイルはdefinitionsディレクトリ内に配置しますが、デフォルトではファイル名がそのままテーブル名となります。なので同名テーブルを複数作成する場合、definitions配下の別階層にファイルを置きます。

また別の方法として、ファイル名と異なるテーブル名を付けることもできます。それにはconfigのnameに作成したいテーブル名を指定します。

config {
  name: "test"
}

こうすればディレクトリを分けなくても同名テーブルを作成できます。しかしいずれの方法を取ったとしても、このまま作成しようとするとエラーになります。なぜなら同名のテーブルを全く同じ場所に作成しようとしているからです。

全く同じ場所を設定するとエラー

出力先のデータセットを指定

同名テーブルは同じデータセット内に作れないので、異なるデータセットを指定する必要があります。そのためにconfigでデータセット名を指定します。
デフォルトの出力先データセットはdataform.jsonにあるdefaultSchemaの値となっています。他のデータセットに出力したい場合はそのテーブルのSQLXファイルのconfigのschemaにデータセット名を入れます。

config {
  schema: "test1"
}

同名テーブルの参照

上記のように作成した同名テーブルの中身を他のテーブルから参照したい場合、単純にテーブル名だけをrefのパラメータで指定するとエラーになります。

同名テーブルがtest1とtest2のデータセットで定義してある場合のエラー

ref内にデータセット名とテーブル名を両方指定しましょう

SELECT * FROM ${ref("test1", "test")}

同名テーブルの宣言

またdeclarationとして予め別のデータセットにある同名テーブルを宣言したい場合も同様です。
宣言する際にデータセット名とテーブル名をセットで指定しましょう。

declare({
  schema: "test1",
  name: "source"
});
declare({
  schema: "test2",
  name: "source"
});

出力先のプロジェクトを指定

別データセットではなく、別プロジェクトの同名データセット・同名テーブルを利用したい場合もあるかもしれませんが、それも可能です。
デフォルトの出力先はDataformを使用しているプロジェクトとなっています。他のプロジェクトに設定したい場合はそのテーブルのSQLXファイルのconfigのdatabaseにプロジェクト名を指定します。

config {
  database: "projectC"
}

また参照する場合は、プロジェクト名、データセット名、テーブル名の順に全て指定しましょう

SELECT * FROM ${ref("projectC", "test2", "test")}

既存のテーブルを宣言したい場合も同様です。

なお別のプロジェクトのテーブルを利用および作成する場合は、Dataformのサービスアカウントに別プロジェクトに対する権限付与をお忘れなく。

Discussion