将JSON有效负载压缩到GZIP,以便使用Urlfetchapp加载到bigQuery中吗? (Utilities.zip不兼容gzip)

问题描述 投票:4回答:2

我的智慧到此为止,任何指针都值得赞赏。

我正在查询Google Analytics(分析)API,将响应转换为适当的JSON格式,并使用Urlfetchapp使用多部分请求将其加载到bigQuery中。但这导致我每天很快达到Urlfetchapp 100MB配额,因此我正在寻找将JSON压缩为GZIP并将其加载到bigQuery的方法(我考虑过Google Cloud Storage,但与保存数据有同样的问题到GCS的用户也首先需要Urlfetchapp,因此这就是Google Apps脚本问题)。

[我已经将数据转换为blob,然后使用Utilities.zip将其压缩并发送了字节,但是经过大量调试后,结果显示格式为.zip,而不是.gzip ..

这是在我的Apps脚本(NEWLINE_DELIMITED_JSON)中创建的json字符串

{"ga_accountname":"photome","ga_querycode":"493h3v63078","ga_startdate":"2013-10-23 00:00:00","ga_enddate":"2013-10-23 00:00:00","ga_segmentname":"#_all_visits","ga_segmentexp":"ga:hostname=~dd.com","ga_landingPagePath":"/","ga_pagePath":"/","ga_secondPagePath":"(not set)","ga_source":"(direct)","ga_city":"Boden","ga_keyword":"(not set)","ga_country":"Sweden","ga_pageviews":"1","ga_bounces":"0","ga_visits":"1"}

我已经解决了其余的API请求(使用可恢复的uploadType,作业配置发送正常,压缩的blob字节可以上传,但是bigQuery表示“输入内容不包含数据。”这是我的Urlfetchapp参数。

        // Sending job configuration first
        var url = 'https://www.googleapis.com/upload/bigquery/v2/projects/' + bqProjectId +'/jobs?uploadType=resumable';
        var options = {
          'contentType': 'application/json; charset=UTF-8',
          'contentLength': newJobSize,
          'headers': {
            'Accept-Encoding': 'gzip, deflate',
            'Accept': 'application/json',
            'X-Upload-Content-Length': zipSize,
            'X-Upload-Content-Type': 'application/octet-stream'
          },
          'method' : 'post',
          'payload' : jobData,
          'oAuthServiceName' : 'bigQuery',
          'oAuthUseToken'  : 'always'
        };

        // Sending job data
        var url = jobReq.getHeaders().Location;

        var options = {
          'contentType': 'application/octet-stream',
          'contentLength': zipSize,
          'contentRange': '0-'+zipSize,
          'method' : 'put',
          'payload' : zipBytes,
          'oAuthServiceName' : 'bigQuery',
          'oAuthUseToken'  : 'always'
        };

我有什么选择?我对API还是很陌生,但是我可以让Urlfetchapp为我将有效载荷压缩到GZIP吗?

json google-apps-script google-bigquery google-cloud-storage urlfetch
2个回答
1
投票

[Google Apps脚本中目前尚无使用gzip的方法-UtilitiesApp.zip()方法仅使用常规zip压缩,而不使用gzip。

而不是使用UrlFetchApp进行分段上传,为什么不使用Google Apps脚本中提供的BigQuery library

var projectId = "Bigquery-Project-Id";    
var job = {
        configuration: {
          load: {
            destinationTable: {
              projectId: projectId,
              datasetId: datasetId,
              tableId: tableId
            },
            sourceFormat: "NEWLINE_DELIMITED_JSON",
            writeDisposition: "WRITE_APPEND"
          }
        }
      };
var data = jobData;
job = BigQuery.Jobs.insert(job, projectId, data);

要启用它,您需要在两个地方打开BigQuery访问。

首先,您需要转到Apps UI中的资源下拉菜单,然后选择高级Google Services ...。在列表上找到“大查询”,然后为其切换“开/关”开关。

关闭高级服务窗口之前,您需要单击底部的Google's Developer Console链接。这将打开您的Google Apps脚本项目的开发者控制台。在控制台的API列表中找到Big Query并启用它。

就是这样-从那里,您可以使用BigQuery Apps类而不是UrlFetchApp将数据传递到BigQuery API。


0
投票

2020状态

对于那些在2020年查看问题的人,已经添加了对gzip的支持,现在已经可以使用Utilities服务方法gzip()及其相应的替代方法了。

GCF选项

使用BigQuery高级服务的另一种选择是将UrlFetchApp和Google Apps Script项目更改为云功能。从那里,可以选择一种首选的语言来编写并利用压缩所需的库/包(例如,NodeJS开箱即用的是Zlib module)。

参考

  1. [gzip方法reference
  2. 云功能reference
© www.soinside.com 2019 - 2024. All rights reserved.