如何在Google Cloud Function中将BigQuery导出的JSON压缩后存入Cloud Storage?
解决方案:BigQuery导出JSON并自动压缩为Gzip存入Cloud Storage
你不需要额外集成pako这类压缩工具,BigQuery的extract方法本身支持直接导出GZIP压缩的文件,这比在云函数里处理压缩更高效——由服务端直接完成压缩和传输,无需占用云函数的计算资源。
修改步骤
- 调整文件名后缀:将输出文件名改为
.json.gz,便于Cloud Storage及其他工具自动识别压缩格式 - 添加压缩配置:在
extract的参数选项中加入compression: 'GZIP',告知BigQuery自动压缩输出内容
修改后的完整代码
const {BigQuery} = require('@google-cloud/bigquery'); const {Storage} = require('@google-cloud/storage'); const functions = require('@google-cloud/functions-framework'); const bigquery = new BigQuery(); const storage = new Storage(); functions.http('extractTableJSON', async (req, res) => { const DateYYYYMMDD = new Date().toISOString().slice(0,10).replace(/-/g,""); const datasetId = "dataset-1"; const tableId = "example"; const bucketName = "domain.appspot.com"; // 修改文件名后缀为json.gz,标识压缩格式 const filename = `/cache/${DateYYYYMMDD}/example.json.gz`; const options = { format: 'json', location: 'US', // 开启BigQuery原生GZIP压缩 compression: 'GZIP' }; try { const [job] = await bigquery .dataset(datasetId) .table(tableId) .extract(storage.bucket(bucketName).file(filename), options); console.log(`Job ${job.id} created.`); // 先检查错误再返回响应,避免重复调用res.send导致报错 const errors = job.status.errors; if (errors && errors.length > 0) { console.error('Extract job errors:', errors); return res.status(500).send(errors); } res.send(`Job ${job.id} created.`); } catch (err) { console.error('Error running extract job:', err); res.status(500).send(err.message); } });
关键说明
- 原生压缩无需额外依赖:BigQuery直接在导出流程中完成压缩,不需要引入pako,减少代码复杂度和云函数的资源消耗
- 传输与存储优化:压缩后的文件体积更小,从BigQuery到Cloud Storage的传输速度更快,同时节省存储成本
- 格式自动识别:
.json.gz后缀让Cloud Storage、BigQuery或其他工具可以自动解压读取内容,无需手动处理压缩逻辑
内容的提问来源于stack exchange,提问作者jmelm93
相关产品推荐
相关产品推荐

