将查询结果导出到 Amazon S3

本文档介绍了如何将针对 BigLake 表运行的查询的结果导出到 Amazon Simple Storage Service (Amazon S3) 存储桶。

如需了解 BigQuery 和 Amazon S3 之间数据流动的方式,请参阅导出数据时的数据流

限制

如需查看适用于基于 Amazon S3 和 Blob Storage 的 BigLake 表的完整限制列表,请参阅限制

准备工作

确保您拥有以下资源:

导出查询结果

不管现有的任何内容如何,BigQuery Omni 都会将数据写入指定的 Amazon S3 位置。导出查询可能会覆盖现有数据,也可能会将查询结果与现有数据混合在一起。我们建议您将查询结果导出到空的 Amazon S3 存储桶。

如需运行查询,请选择以下选项之一:

SQL

查询编辑器字段中,输入 GoogleSQL 导出查询。 GoogleSQL 是 Google Cloud 控制台中的默认语法。

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

       EXPORT DATA WITH CONNECTION `CONNECTION_REGION.CONNECTION_NAME`
       OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...)
       AS QUERY

    请替换以下内容:

    • CONNECTION_REGION:在其中创建连接的区域。
    • CONNECTION_NAME:您使用写入 Amazon S3 存储桶所需的权限创建的连接名称。
    • BUCKET_NAME:要向其中写入数据的 Amazon S3 存储桶。
    • PATH:您要将导出的文件写入其中的路径。它只能在路径字符串的叶目录中的任何位置包含一个通配符 *,例如 ../aa/*../aa/b*c../aa/*bc../aa/bc*。BigQuery 会将 * 替换为 0000..N,具体取决于导出的文件数。BigQuery 会确定文件计数和大小。如果 BigQuery 决定导出两个文件,则第一个文件名中的 * 会被替换为 000000000000,第二个文件名中的 * 会被替换为 000000000001
    • FORMAT:支持的格式为 JSONAVROCSVPARQUET
    • QUERY:用于分析存储在 BigLake 表中的数据的查询。

    • 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

// Sample to export query results to Amazon S3 bucket
public class ExportQueryResultsToS3 {

  public static void main(String[] args) throws InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String externalTableName = "MY_EXTERNAL_TABLE_NAME";
    // connectionName should be in the format of connection_region.connection_name. e.g.
    // aws-us-east-1.s3-write-conn
    String connectionName = "MY_CONNECTION_REGION.MY_CONNECTION_NAME";
    // destinationUri must contain exactly one * anywhere in the leaf directory of the path string
    // e.g. ../aa/*, ../aa/b*c, ../aa/*bc, and ../aa/bc*
    // BigQuery replaces * with 0000..N depending on the number of files exported.
    // BigQuery determines the file count and sizes.
    String destinationUri = "s3://your-bucket-name/*";
    String format = "EXPORT_FORMAT";
    // Export result of query to find states starting with 'W'
    String query =
        String.format(
            "EXPORT DATA WITH CONNECTION `%s` OPTIONS(uri='%s', format='%s') "
              + "AS SELECT * FROM %s.%s.%s WHERE name LIKE 'W%%'",
            connectionName, destinationUri, format, projectId, datasetName, externalTableName);
    exportQueryResultsToS3(query);
  }

  public static void exportQueryResultsToS3(String query) throws InterruptedException {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableResult results = bigquery.query(QueryJobConfiguration.of(query));

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query results exported to Amazon S3 successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

问题排查

如果您收到与 quota failure 相关的错误,请检查您是否为查询预留了容量。如需详细了解槽预留,请参阅本文档中的准备工作部分。

后续步骤