当前位置: 首页 > 知识库问答 >
问题:

使用JavaAPI从Google工作表创建BigQuery表-拒绝访问

白博赡
2023-03-14

一个应用程序引擎应用程序使用驱动API创建了一个Google驱动表(来自XLS),并带有默认的服务帐户。新创建的文档已与个人共享,文件访问权限已确认。

File file = driveService.files().create(fileMetadata, inputStreamContent)
        .setFields("id")
        .execute();
    Logger.info("Created file: %s", file.getId());
    BatchRequest batch = driveService.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer")
        .setEmailAddress("personal.email@gmail.com");
    driveService.permissions().create(file.getId(), userPermission)
        .setFields("id")
        .execute();

现在我想从这个Google表单创建一个BigQuery表。所以我已经为上一步启用了驱动API。我已调整BigQuery服务,以创建具有必要作用域的凭据:

private static final List<String> SCOPES = asList(DriveScopes.DRIVE, 
DriveScopes.DRIVE_READONLY, SheetsScopes.SPREADSHEETS, AUTH, BIGQUERY);
GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES); 
BigQueryOptions options = BigQueryOptions.newBuilder().setCredentials(googleCredentials).build(); 
BigQuery bigQuery = options.getService();

但当我调用控制器接收带有以下代码的工作表时,仍然没有运气:

ExternalTableDefinition tableDefinition = ExternalTableDefinition
        .of(String.format(GOOGLE_DRIVE_LOCATION_FORMAT, fileId), categoryMappingSchema(),
            GoogleSheetsOptions.newBuilder().setSkipLeadingRows(FIRST_ROW).build());
    TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

    Table table = bigQuery.create(tableInfo);

我得到的错误表明范围没有提供给凭据。

拒绝访问:BigQuery BigQuery:未找到具有Google驱动器作用域的OAuth令牌。

我是不是漏了什么?

共有1个答案

能远
2023-03-14

我怀疑ADC有问题——当我从json密钥初始化凭据时,它按预期工作:

InputStream inputStream = new ChannelInputStream(inputChannel);
            bqCredentials = GoogleCredentials
                .fromStream(inputStream)
                .createScoped(BQ_SCOPES);

这种方法不起作用:

GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES); 
 类似资料:
  • 我是Google BigQuery的新手。如果我的问题有点简单,请原谅。 让我澄清问题的背景: > AcCount1创建一个桶(多区域)和外部表。 Account1可以成功查询外部表数据。 授予Account2以下项目角色。 BigQuery中的AcCount2日志可以看到表,但无法查询数据,错误如下。 我做了一些研究并启用了BigQueryAPI,问题仍然存在。

  • 有没有办法使用Google工作表API只读取列X中带有空单元格的行? 这是我今天从谷歌表单上看到的方式,但我没有看到任何“过滤”方法。

  • addSheet([string $sheetName]); 示例 $config = [ 'path' => './filePath' ]; ​ $excel = new \Vtiful\Kernel\Excel($config); ​ // 此处会自动创建一个工作表 $fileObject = $excel->fileName("tutorial01.xlsx"); ​ $fileO

  • 我想通过API(appscript)在Google工作表中实现组,因为direct方法不能动态工作。我有一个名为levels(0-8)的列,然后还有两个列(其他信息)。我想写一个脚本来组成小组。它将检查具有级别的第一列,如果下一行的级别高于当前i级别,它将生成一组这些行,直到出现具有相同级别或低于i级别的行。例如,级别为:1,2,3,4,1,0,3,4。在这种情况下,它将从1开始,并将2,3,4作

  • 我正在尝试将DataStudio报表连接到表和来自BigQuery的视图。在BigQuery中,表从位于我的驱动器中的GoogleSheet接收数据,视图正在查询同一个表,但添加了一些新字段。当我尝试将图表连接到其中一个数据源时,出现以下错误: BigQuery错误:访问被拒绝:BigQuery BigQuery:获取驱动器凭据时权限被拒绝。 原因是什么?我该怎么做才能解决这个问题? 我要说的是,

  • 我正在使用@google-Cloud/bigQuery将Angular10, Firebase与BigQuery集成。我在我的项目中创建了一个函数文件夹,并在其中添加了密钥json文件,该文件是在谷歌云控制台上生成服务帐户json后获得的。 我的BigQuery仪表板中有两个数据集,其源是Google Drive。但当我试图查询这些表时,我得到了一个错误。 在我的函数文件夹中,我有index.js