[英]Conditional statements in my BigQuery queries are being ignored
我有一個包含幾列的簡單 BigQuery 表。 其中一列名為my_id
(類型為STRING
)。 我正在像這樣查詢我的 BigQuery 數據集:
import * as bq from "@google-cloud/bigquery";
const bqdb = new bq.BigQuery();
// ...
const projectId = 'my_project';
const datasetId = "my_dataset";
const tableId = "my_table";
const dbId = [projectId, datasetId, tableId].join('.');
// myIds is an array of strings
const stringedArray = myIds.map((id) => '\'' + id + '\'');
const sql_select_query = `
SELECT my_id
FROM \`${dbId}\`
WHERE my_id IN (${String(stringedArray)})
LIMIT 1
;
`;
const dataset = bqdb.dataset(datasetId);
const destinationTable = dataset.table(tableId);
console.log("Querying database...");
const queryOptions = {
query: sql_select_query,
destination: destinationTable,
write_disposition: "WRITE_APPEND",
priority: 'BATCH',
};
// Run the query as a job
const [job] = await bqdb.createQueryJob(queryOptions);
// Wait for the job to finish.
const results = await job.getQueryResults({maxResults: 500});
const resutsArray = results[0]
此查詢帶回整個表(所有行、所有列)。 換句話說,這個查詢的結果和我寫的一樣:
const sql_select_query = `
SELECT *
FROM \`${dbId}\`
;
`;
輸出的格式類似於一個成功的查詢:沒有錯誤消息或警告。 但是我所有的條件都被忽略了,甚至LIMIT
。
為什么 BigQuery 將整個表轉儲到響應中?
如果您的查詢設置設置為將結果寫入目標表並使用write_disposition: "WRITE_APPEND"
, job.getQueryResults()
將返回目標表的數據以及新附加的數據,這是 BigQuery 的預期行為。
job.getQueryResults()
僅在配置了目標表並且寫入處置為“如果為空則寫入”或“覆蓋表”時才返回最初選擇的結果。
作為一種解決方法,您可以查詢兩次,首先使用臨時表返回帶條件的結果,然后再次運行查詢附加到目標表。
使用您的代碼,您可以創建兩個查詢選項。 第一個查詢選項沒有destination
,第二個查詢選項有destination
和write_disposition
。 然后創建兩個使用第一個和第二個查詢選項的作業。
代碼片段:
const queryOptions = {
query: sql_select_query,
priority: 'BATCH',
};
const queryOptionsWrite = {
query: sql_select_query,
destination: destinationTable,
write_disposition: "WRITE_APPEND",
priority: 'BATCH',
};
const [queryJob] = await bqdb.createQueryJob(queryOptions);
const queryResults = await queryJob.getQueryResults();
console.log("Query result:");
console.log(queryResults[0]);
const [writeJob] = await bqdb.createQueryJob(queryOptionsWrite);
const writeResults = await writeJob.getQueryResults();
console.log("\nUpdated table values:");
console.log(writeResults[0]);
測試完成:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.