Google bigquery BigQuery:如何使用新的存储JSON文件自动加载表?

Google bigquery BigQuery:如何使用新的存储JSON文件自动加载表?,google-bigquery,Google Bigquery,我刚刚通过链接Google云存储中可用的JSON文件创建了一个BigQuery表。但我看不到任何在Google云存储文件夹或存储桶中添加新文件时自动重新加载表行的选项 目前,我必须转到BigQuery控制台,然后删除并重新创建同一个表以加载新文件。但是这个解决方案对我们来说是不可伸缩的,因为我们在BigQueryAPI上运行cron作业。如何在BigQuery中自动重新加载数据 感谢您在Google云存储中的文件顶部定义外部表-您可以使用通配符作为源位置,因此您的表将表示匹配的所有文件 然后,当

我刚刚通过链接Google云存储中可用的JSON文件创建了一个BigQuery表。但我看不到任何在Google云存储文件夹或存储桶中添加新文件时自动重新加载表行的选项

目前,我必须转到BigQuery控制台,然后删除并重新创建同一个表以加载新文件。但是这个解决方案对我们来说是不可伸缩的,因为我们在BigQueryAPI上运行cron作业。如何在BigQuery中自动重新加载数据


感谢您在Google云存储中的文件顶部定义外部表-您可以使用通配符作为源位置,因此您的表将表示匹配的所有文件

然后,当您查询这样的表时,您可以使用_file_name字段,它将“告诉”您给定的行来自哪个文件

SELECT  
  _file_name AS file,
  *
FROM `yourTable`   

这样,每当您在GCS中添加新文件时,当您在Google云存储中的文件顶部定义外部表时,您将“自动”在表中获得该文件。您可以使用通配符作为源位置,因此您的表将表示匹配的所有文件

然后,当您查询这样的表时,您可以使用_file_name字段,它将“告诉”您给定的行来自哪个文件

SELECT  
  _file_name AS file,
  *
FROM `yourTable`   

这样,每当您在GCS中添加新文件时,您都会“自动”将其放入表中。

使用谷歌云功能,您可以在每次收到新文件时自动执行BigQuery:

  • 在以下位置创建新函数:
  • 将“bucket”指向接收文件的那个
代码方面,在
package.json内导入BigQuery:

{
  "dependencies": {
    "@google-cloud/bigquery": "^0.9.6"
  } 
}
index.js
上,您可以以任何适当的方式对新文件执行操作:

var bigQuery = BigQuery({ projectId: 'your-project-id' });

exports.processFile = (event, callback) => {
  console.log('Processing: ' + JSON.stringify(event.data));
  query(event.data);
  callback();
};

var BigQuery = require('@google-cloud/bigquery');

function query(data) {
    const filename = data.name.split('/').pop();
    const full_filename = `gs://${data.bucket}/${data.name}`

    // if you want to run a query:
    query = '...'
    bigQuery.query({
        query: query,
        useLegacySql: false
    });
};

使用谷歌云功能,您可以在每次收到新文件时自动执行BigQuery:

  • 在以下位置创建新函数:
  • 将“bucket”指向接收文件的那个
代码方面,在
package.json内导入BigQuery:

{
  "dependencies": {
    "@google-cloud/bigquery": "^0.9.6"
  } 
}
index.js
上,您可以以任何适当的方式对新文件执行操作:

var bigQuery = BigQuery({ projectId: 'your-project-id' });

exports.processFile = (event, callback) => {
  console.log('Processing: ' + JSON.stringify(event.data));
  query(event.data);
  callback();
};

var BigQuery = require('@google-cloud/bigquery');

function query(data) {
    const filename = data.name.split('/').pop();
    const full_filename = `gs://${data.bucket}/${data.name}`

    // if you want to run a query:
    query = '...'
    bigQuery.query({
        query: query,
        useLegacySql: false
    });
};

很好的解决方案,米哈伊尔。OP应该记住,使用联邦源将导致性能下降,而不是本机表。另一个选择是编写一个小的云函数,在新文件到达bucket时触发。然后,云函数可以启动对本机表或数据流管道的BQ加载作业。您是对的,同时,正如OP提到的“链接”,我假设他已经在使用联邦表,但只是不知道如何处理新表。但从我的角度来看,这可能是错误的假设。是的,如果需要实际加载新文件,云函数“链接”到bucket等是最简单的方法——完全同意:o)这也是我的假设。只是想向OP指出,还有其他(更整洁!?)选项可用;-)如何启动对本机表的BQ加载作业?删除表并重新创建一个?感谢您提供的额外知识和正确答案,非常感谢。很好的解决方案Mikhail。OP应该记住,使用联邦源将导致性能下降,而不是本机表。另一个选择是编写一个小的云函数,在新文件到达bucket时触发。然后,云函数可以启动对本机表或数据流管道的BQ加载作业。您是对的,同时,正如OP提到的“链接”,我假设他已经在使用联邦表,但只是不知道如何处理新表。但从我的角度来看,这可能是错误的假设。是的,如果需要实际加载新文件,云函数“链接”到bucket等是最简单的方法——完全同意:o)这也是我的假设。只是想向OP指出,还有其他(更整洁!?)选项可用;-)如何启动对本机表的BQ加载作业?删除表格并重新创建一个?感谢您提供的额外知识和正确答案,非常感谢。