簡體   English   中英

我的 BigQuery 查詢中的條件語句被忽略

[英]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 ,第二個查詢選項有destinationwrite_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM