Google BigQueryに、Google Cloud Storageのファイルをロードする時、複数のファイルをまとめてロードすることができます。
しかし、それをGoogle BigQueryのNode.js SDKでやろうとしてハマったので、そのメモ書きです。
概要および問題点
table.createLoadJob()
を使ってロードします。- ファイルは1番目の引数に、Cloud StorageのFileオブジェクトを指定します
- ファイルが1つだけの場合、Fileオブジェクトを1つだけ渡します
- ファイルが複数の場合、Fileオブジェクトの配列を渡します
しかし、TypeScriptの型定義では、ファイルが1つの場合しか書かれていないため、そのままFileの配列を渡すとエラーになってしまいます。
手順
キャストでFileの配列をanyにしてエラーがでないようにして渡します。
Googleのサンプルを修正すると、下記のような形になります。
await table.createLoadJob( ( [ storage.bucket('institutions').file('2011.csv'), storage.bucket('institutions').file('2012.csv') ] as any) );
感想など
ドキュメントにはFileオブジェクトは1つとあるのですが、サンプルには複数オブジェクトを渡す例がありました。
ソースを見ると、1ファイルorファイル配列の、どちらでも大丈夫なようにで書かれているのですが、型定義で1つしか設定されていないため、そのままではコンパイルで弾かれてしまいます。
ファイル1つづつロードすることも可能なのですが、BigQueryは1日のロード回数に上限があるので、大量のファイルがある場合はまとめて上げたく、それができないと辛いです。