【问题标题】:Compress JSON payload to GZIP for loading into bigQuery with Urlfetchapp? ( Utilities.zip not gzip compatible)将 JSON 有效负载压缩到 GZIP 以使用 Urlfetchapp 加载到 bigQuery? (Utilities.zip 不兼容 gzip)
【发布时间】:2014-01-19 11:11:11
【问题描述】:

我在我的智慧在这里结束,所以任何指针都非常感谢。

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

我已将数据转换为 blob,然后使用 Utilities.zip 对其进行压缩并发送字节,但经过大量调试后发现格式是 .zip,而不是 .gzip..

这是在我的 Apps 脚本中创建的 json 字符串 (NEWLINE_DELIMITED_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 吗?

【问题讨论】:

  • 能否包含分配 zipSize 和 zipBytes 的代码?

标签: json google-apps-script google-bigquery google-cloud-storage urlfetch


【解决方案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 中的 Resources 下拉菜单,然后选择 Advanced Google Services... 。在列表中找到 Big Query,并为其切换 On/Off 开关。

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

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

【讨论】:

    【解决方案2】:

    2020 年状态

    对于那些在 2020 年查看问题的人,对 gzip 的支持现在已经添加了一段时间,并且可以在 Utilities 服务方法 gzip() 及其相应的覆盖下获得。

    GCF 选项

    使用 BigQuery 高级服务的另一个替代方法是从 UrlFetchApp 和 Google Apps 脚本项目更改为云功能。从那里,人们可以选择首选语言来编写并利用压缩所需的库/包(例如,NodeJS 有一个开箱即用的Zlibmodule)。

    参考文献

    1. gzip 方法 reference
    2. 云函数reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多