我有一个运行的查询,可以查看结果。但是在尝试将查询保存为视图表时,我收到错误消息
无法保存视图。找不到合适的凭据来访问Google 驾驶。请联系表所有者以获取帮助。
我认为问题是由查询中使用的表引起的。该表是从谷歌表(带有源URI)上传的,由我自己拥有。我试图从项目中启用Google Drive API,但没有运气。不确定如何让BigQuery访问Google云端硬盘。
答案 0 :(得分:1)
我怀疑你遇到的问题是OAuth Scopes之一。要与Google云端硬盘API通信以读取数据,您需要使用已授予该API访问权限的凭据。
如果您使用的是BigQuery Web UI并且未明确授予对Drive的访问权限,则无法使用。例如,我第一次尝试“保存到Google表格”时,BigQuery用户界面会弹出一个OAuth提示,要求我授予对我的Google云端硬盘的访问权限。在此之后它可以保存结果。尝试执行此操作以确保您的凭据具有云端硬盘范围,然后再次“保存视图”。
如果您使用自己的代码执行此操作,除了您已用于与BigQuery交谈的'https://www.googleapis.com/auth/drive'
范围外,还应请求范围'https://www.googleapis.com/auth/bigquery'
。
如果您使用的是bq
客户端,则它已更新为请求此范围,但您可能需要重新初始化身份验证凭据。您可以使用bq init --delete_credentials
执行此操作以删除凭据,然后执行我们重新请求凭据的下一个操作。
答案 1 :(得分:0)
使用Google App Script这对我有用:
function saveQueryToTable() {
var projectId = '...yourprojectid goes here...';
var datasetId = '...yourdatesetid goes here...';
var sourceTable = '...your table or view goes here...';
var destTable = '...destination table goes here...';
var myQuery;
//just a random call to activate the Drive API scope
var test = Drive.Properties.list('...drive file id goes here...')
//list all tables for the particular dataset
var tableList = BigQuery.Tables.list(projectId, datasetId).getTables();
//if the table exist, delete it
for (var i = 0; i < tableList.length; i++) {
if (tableList[i].tableReference.tableId == destTable) {
BigQuery.Tables.remove(projectId, datasetId, destTable);
Logger.log("DELETED: " + destTable);
}
};
myQuery = 'SELECT * FROM [PROJECTID:DATASETID.TABLEID];'
.replace('PROJECTID',projectId)
.replace('DATASETID',datasetId)
.replace('TABLEID',sourceTable)
var job = {
configuration: {
query: {
query: myQuery,
destinationTable: {
projectId: projectId,
datasetId: datasetId,
tableId: destTable
}
}
}
};
var queryResults = BigQuery.Jobs.insert(job, projectId);
Logger.log(queryResults.status);
}
“技巧”是随机调用Drive API以确保包含BigQuery和Drive范围。