【问题标题】:Conditional statements in my BigQuery queries are being ignored我的 BigQuery 查询中的条件语句被忽略
【发布时间】:2021-12-27 21:58:50
【问题描述】:

我有一个包含几列的简单 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 将整个表转储到响应中?

【问题讨论】:

    标签: node.js google-bigquery


    【解决方案1】:

    如果您的查询设置设置为将结果写入目标表并使用write_disposition: "WRITE_APPEND"job.getQueryResults() 将返回目标表的数据以及新附加的数据,这是 BigQuery 的预期行为。

    job.getQueryResults() 仅在配置了目标表且写入处置为“如果为空时写入”或“覆盖表”时才会返回最初选择的结果。

    作为一种解决方法,您可以查询两次,首先使用临时表返回带条件的结果,然后再次运行查询,并附加到目标表。

    使用您的代码,您可以创建两个查询选项。第一个查询选项没有destination,第二个查询选项有destinationwrite_disposition。然后创建两个使用第一个和第二个查询选项的作业。

    代码sn-p:

    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]);
    
    

    测试完成:

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多