GAS: BigQuery へ SELECT クエリを実行する
February 27, 2021
やりたいこと #
- Google Apps Script から BigQuery へクエリを発行する
- 発行したクエリの結果を取得する
事前に知っておくべきこと #
- 基本的にはリファレンスにある BigQuery Service のサンプルコード通りに書けばよい
- 標準 SQL とレガシー SQL というものがあり、BigQuery コンソールのデフォルトが標準 SQL、GAS の BigQuery ライブラリのデフォルトがレガシー SQL のため単純にコピペするとその差異で動かなかったりする
- クエリを渡す request オブジェクトに
useLegacySql: false
を渡してやると標準SQLで動く
サンプルコード #
function runQuery() {
const projectId = '<YOUR PROJECT NAME HERE>';
let queryResults = BigQuery.Jobs.query({
useLegacySql: false,
query: `
SELECT 1 AS num, 'aaa' AS str UNION ALL
SELECT 2 AS num, 'bbb' AS str UNION ALL
SELECT 3 AS num, 'ccc' AS str
`
}, projectId);
const jobId = queryResults.jobReference.jobId;
let sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
}
let rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
if (rows) {
const headers = queryResults.schema.fields.map(({name}) => name);
const data = rows.map(({f}) => f.map(({v}) => v));
data.unshift(headers);
console.log(data);
}
}
結果 #
[ [ 'num', 'str' ],
[ '1', 'aaa' ],
[ '2', 'bbb' ],
[ '3', 'ccc' ] ]
num
カラムは INT64 型のはずだが文字列。型情報は欠落するっぽい。