Dataformで同名のテーブルを複数作る
この記事はときは会アドベントカレンダーの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