【问题标题】:Creating BigQuery table from Google Sheet using Java API - access denied使用 Java API 从 Google Sheet 创建 BigQuery 表 - 访问被拒绝
【发布时间】:2019-02-11 14:44:46
【问题描述】:

已使用 Drive API(来自 XLS)创建了 Google 驱动器表 - 由 App Engine 应用程序使用默认服务帐户。新创建的文档已与个人共享,并且已确认对文件的访问。

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 表。所以我已经为上一步明显启用了 Drive 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 Drive 范围的 OAuth 令牌。

我错过了什么吗?

【问题讨论】:

  • 在开始编写代码之前,您是否检查了此处列出的所有三个步骤? stackoverflow.com/questions/40731823/…
  • 感谢@GrahamPolley - 是的,之前看过这个问题,按照说明进行操作

标签: google-app-engine google-cloud-platform google-bigquery


【解决方案1】:

我怀疑 ADC 存在问题 - 当我从 json 键初始化凭据时,它按预期工作:

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

这种方法不起作用:

GoogleCredentials googleCredentials = AppEngineCredentials.getApplicationDefault().createScoped(SCOPES); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多