Exportar resultados de consultas a Amazon S3

En este documento se describe cómo exportar el resultado de una consulta que se ejecuta en una tabla BigLake a tu segmento de Amazon Simple Storage Service (Amazon S3).

Para obtener información sobre cómo fluyen los datos entre BigQuery y Amazon S3, consulta Flujo de datos al exportar datos.

Limitaciones

Para ver una lista completa de las limitaciones que se aplican a las tablas de BigLake basadas en Amazon S3 y Blob Storage, consulta Limitaciones.

Antes de empezar

Asegúrate de que tienes los siguientes recursos:

Exportar resultados de consultas

BigQuery Omni escribe en la ubicación de Amazon S3 especificada, independientemente del contenido que haya. La consulta de exportación puede sobrescribir los datos o combinar el resultado de la consulta con los datos. Te recomendamos que exportes el resultado de la consulta a un segmento de Amazon S3 vacío.

Para ejecutar una consulta, selecciona una de las siguientes opciones:

SQL

En el campo Editor de consultas, introduce una consulta de exportación de GoogleSQL. GoogleSQL es la sintaxis predeterminada en la Google Cloud consola.

.
  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

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

    Haz los cambios siguientes:

    • CONNECTION_REGION: la región en la que se creó la conexión.
    • CONNECTION_NAME: el nombre de la conexión que has creado con el permiso necesario para escribir en el segmento de Amazon S3.
    • BUCKET_NAME: el segmento de Amazon S3 en el que quieres escribir los datos.
    • PATH: la ruta en la que quieres escribir el archivo exportado. Debe contener exactamente un comodín * en cualquier parte del directorio de hoja de la cadena de ruta. Por ejemplo, ../aa/*, ../aa/b*c, ../aa/*bc y ../aa/bc*. BigQuery sustituye * por 0000..N en función del número de archivos exportados. BigQuery determina el número y el tamaño de los archivos. Si BigQuery decide exportar dos archivos, * en el nombre del primer archivo se sustituye por 000000000000, y * en el nombre del segundo archivo se sustituye por 000000000001.
    • FORMAT: los formatos admitidos son JSON, AVRO, CSV y PARQUET.
    • QUERY: la consulta para analizar los datos que se almacenan en una tabla de BigLake. El conjunto de datos que contiene la tabla de BigLake usada en la consulta debe estar en la misma región de Amazon S3 que el segmento de Amazon S3 de destino.

    • Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

Java

Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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());
    }
  }
}

Solución de problemas

Si recibes un error relacionado con quota failure, comprueba si has reservado capacidad para tus consultas. Para obtener más información sobre las reservas de slots, consulta la sección Antes de empezar de este documento.

Siguientes pasos