我可以使用API​​将数据附加到CSV文件中的现有BigQuery表吗?

时间:2017-03-27 07:19:37

标签: google-apps-script google-api google-bigquery

我尝试使用Google Apps脚本使用BigQuery API将数据附加到BigQuery表中。要追加的数据目前是CSV格式。到目前为止,我发现你可以stream data into BigQuery使用tabledata().insertAll(),但它看起来需要json格式,我甚至不相信它会做我需要的。我是否有一个直截了当的解决方案?因为我知道BigQuery支持追加,但我发现的所有内容都集中在将数据加载到新表中。

修改 听起来像tabledata().insertAll()确实是正确的使用方法(希望如此)。所以我将我的文件转换为json,但现在我仍然坚持如何实际使用它。我试图建立我reference page for it所做的事情,但它仍然让我感到困惑。目前,当我运行我的代码时,我收到404错误,并且它会点击fetch来电。我试图进行网址抓取,也许这不是我应该做的事情?我对API很陌生,我还在弄清楚它们是如何工作的。以下是我目前所拥有的代码:

var tableId = 'users';
var file = DriveApp.getFileById(jsonId);
//I don't know if a blob is the type that I want or not, but I'm trying it
var data = file.getBlob();

var url = 'https://www.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/tableId/insertAll'
.replace("PROJECT_ID", params.PROJECT_ID)
.replace("DATASET_ID", params.DATASET_ID)
.replace("tableId", tableId);

var response = UrlFetchApp.fetch(url, {
"kind": "bigquery#tableDataInsertAllRequest",
"skipInvalidRows": 0,
"ignoreUnknownValues": 0,
"rows": [
  {
    "json": data
  }
],
headers: {
  Authorization: 'Bearer ' + service.getAccessToken()
}
});


var result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));

1 个答案:

答案 0 :(得分:1)

这不是从csv到BQ JSON最直接的,但是我使用的一些代码可以帮助你在BigQuery方面。

<input type="text" ng-model='$parent.name' />

这允许您提供任何GAS样式值矩阵(来自getValues或实际上Utilities.parseCsv

var PROJECT_ID = "xxx"; var DATASET_ID = "yyy"; function convertValuesToRows(data) { var rows = []; var headers = data[0]; for (var i = 1, numColumns = data.length; i < numColumns; i++) { var row = BigQuery.newTableDataInsertAllRequestRows(); row.json = data[i].reduce(function(obj, value, index) { obj[headers[index]] = value; return obj }, {}); rows.push(row); }; return rows; } function bigqueryInsertData(data, tableName) { var insertAllRequest = BigQuery.newTableDataInsertAllRequest(); insertAllRequest.rows = convertValuesToRows(data); var response = BigQuery.Tabledata.insertAll(insertAllRequest, PROJECT_ID, DATASET_ID, tableName); if (response.insertErrors) { Logger.log(response.insertErrors); } } 将采用2d字符串数组(带标题)并以BigQuery需要的格式对其进行编码,例如。

convertValuesToRows

将以键值对的形式添加到insertRows请求中,即

[["H1", "H2", "H3"],
 [1   , 2   , 3   ],
 [4   , 5   , 6   ]];

您只需要担心第一个表示形式,因为这是您传递给bigQueryInsertData的内容以及要将数据输入的表名称(表格的模式需要与您发送的内容相匹配)和转换器函数从内部调用。

[{H1: 1, H2: 2, H3: 3}, {H1: 4, H2: 5, H3: 6}] 已经返回了一个二维数组字符串,因此您基本上可以调用Utilities.parseCsv