通过 POST 将 CSV 数据发送到 BigQuery REST API

Posted

技术标签:

【中文标题】通过 POST 将 CSV 数据发送到 BigQuery REST API【英文标题】:Sending CSV data to BigQuery REST API via POST 【发布时间】:2018-04-08 16:42:05 【问题描述】:

我一直在尝试通过 POST 请求将 *.csv blob 上传到 BigQuery,但我无法确定应将 blob 文件(即字节数据)放在请求中的哪个位置。

如果我使用客户端库,则此代码可以满足我的需要:

var job = 
  configuration: 
    load: 
      destinationTable: 
        projectId: projectId,
        datasetId: datasetId,
        tableId: tableId
      ,
      skipLeadingRows: 1,
      allowQuotedNewlines: true,
      quote: "'",
      sourceFormat: 'CSV'
    
  
;
var job = BigQuery.Jobs.insert(job, projectId, csv);

这很完美,但是在搜索 REST API 时,我看不到任何地方声明设置 *.csv 数据以便像这样工作,没有客户端库:

var job = 
  configuration: 
    load: 
      destinationTable: 
        projectId: projectId,
        datasetId: datasetId,
        tableId: tableId
      ,
      skipLeadingRows: 1,
      allowQuotedNewlines: true,
      quote: "'",
      sourceFormat: 'CSV'
    
  
;
var url = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/jobs/";
var urlParams = 
  "method": "POST",
  "muteHttpExceptions": true,
  "contentType": "application/json",
  "headers": "Authorization": "Bearer " + getBQToken(),
  "responseType": "json",
  payload: job,
;
var resp = UrlFetchApp.fetch(url, urlParams).getContentText();
var result = JSON.parse(resp);

在使用 REST API 方法时如何包含我的 CSV 数据和作业配置?

【问题讨论】:

documentation on uploads 有帮助吗? 【参考方案1】:

上传请求有两种方式:分段上传和可恢复上传。分段上传是“用于快速传输较小的文件和元数据;将文件与描述它的元数据一起传输,所有这些都在一个请求中”。如here 所述(正如@Elliott Brossard 所指出的),可恢复上传是“为了可靠传输,尤其是对于较大的文件尤其重要”。在同一文档中找到以下 Google BigQuery API 示例的可恢复上传请求:

POST /upload/bigquery/v2/projects/<projectId>/jobs?uploadType=resumable HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer your_auth_token
Content-Length: 38
Content-Type: application/json; charset=UTF-8
X-Upload-Content-Type: */*
X-Upload-Content-Length: 2000000


  "configuration": 
    "load": 
      "sourceFormat": "NEWLINE_DELIMITED_JSON",
      "schema": 
        "fields": [
          "name": "f1", "type": "STRING",
          "name": "f2", "type": "INTEGER"
        ]
      ,
      "destinationTable": 
        "projectId": "projectId",


  "datasetId": "datasetId",
    "tableId": "tableId"
  

【讨论】:

以上是关于通过 POST 将 CSV 数据发送到 BigQuery REST API的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的客户将 BigQuery 查询结果导出为 CSV

如何在 jmeter 的 post 请求中发送 csv 文件或 json 数据?

通过 angular http post 将 json 数据发送到 laravel 控制器

通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器

通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器

发送无表单的 POST 数据