Exporter des résultats de requête vers Amazon S3

BigQuery Omni vous permet d'exporter directement le résultat d'une requête vers Amazon S3.

Avant de commencer

Vérifiez que vous disposez de la bonne stratégie IAM (Identity and Access Management) d'Amazon Web Services (AWS) :

Exécuter une requête

Pour exécuter une requête, utilisez Google Cloud Console ou l'outil de ligne de commande bq.

Google Cloud Console

  1. Ouvrez la page BigQuery dans Google Cloud Console.

    Accéder à BigQuery

  2. Dans le champ Éditeur de requête, saisissez une requête d'exportation en SQL standard. Le langage SQL standard est la syntaxe par défaut dans Cloud Console.

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

    Remplacez l'élément suivant :

    • CONNECTION_REGION : région dans laquelle la connexion a été créée.
    • CONNECTION_NAME : nom de la connexion que vous avez créée avec l'autorisation nécessaire pour écrire dans le bucket S3.
    • BUCKET_NAME : bucket Amazon S3 que vous avez créé pour l'écriture.
    • PATH : chemin d'accès dans lequel vous souhaitez écrire le fichier exporté. Il doit contenir exactement un caractère générique *, n'importe où dans le répertoire feuille de la chaîne du chemin d'accès, par exemple, ../aa/*, ../aa/b*c, ../aa/*bc et ../aa/bc*. BigQuery remplace * par 0000..N en fonction du nombre de fichiers exportés. BigQuery détermine le nombre et la taille des fichiers. Si BigQuery décide d'exporter deux fichiers, alors * dans le nom du premier fichier est remplacé par 000000000000, et * dans le nom du deuxième fichier par 000000000001.
    • FORMAT : les formats acceptés sont JSON, AVRO et CSV.
    • QUERY : requête que vous souhaitez exécuter pour analyser les données.

    Par exemple, la requête suivante exporte les résultats de la requête de BigQuery vers s3://bq-omni-bucket/exported/000000000000 dans S3 :

    EXPORT DATA WITH CONNECTION `aws-us-east-1.s3-write-conn` OPTIONS(uri="s3://bq-omni-bucket/exported/*", format="CSV") AS SELECT * FROM s3dataset.s3table
    
  3. Cliquez sur Run (Exécuter).

bq

Exécutez la commande query, puis spécifiez la syntaxe SQL standard à l'aide de l'option --nouse_legacy_sql ou --use_legacy_sql=false.

Pour exécuter la requête d'exportation, saisissez la commande suivante :

bq query --nouse_legacy_sql \
EXPORT DATA WITH CONNECTION CONNECTION_REGION.CONNECTION_NAME \
OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...) \
AS QUERY

Remplacez l'élément suivant :

  • CONNECTION_REGION : région dans laquelle la connexion a été créée.
  • CONNECTION_NAME : nom de la connexion que vous avez créée avec l'autorisation nécessaire pour écrire dans le bucket S3.
  • BUCKET_NAME : bucket Amazon S3 que vous avez créé pour l'écriture.
  • PATH : chemin d'accès dans lequel vous souhaitez écrire le fichier exporté. Il doit contenir exactement un caractère générique *, n'importe où dans le répertoire feuille de la chaîne du chemin d'accès, par exemple, ../aa/*, ../aa/b*c, ../aa/*bc et ../aa/bc*. BigQuery remplace * par 0000..N en fonction du nombre de fichiers exportés. BigQuery détermine le nombre et la taille des fichiers. Si BigQuery exporte deux fichiers, alors * dans le nom du premier fichier est remplacé par 000000000000, et * dans le nom du deuxième fichier par 000000000001.
  • FORMAT : les formats acceptés sont JSON, AVRO et CSV.
  • QUERY : requête que vous souhaitez exécuter pour analyser les données.

Java

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

Étape suivante