我尝试使用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));
答案 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