Interroger les données Amazon S3

Ce document explique comment interroger des données stockées dans une table BigLake Amazon Simple Storage Service (Amazon S3).

Avant de commencer

Assurez-vous de disposer d'une table BigLake Amazon S3.

Rôles requis

Pour interroger des tables BigLake Amazon S3, assurez-vous que l'appelant de l'API BigQuery dispose des rôles suivants :

  • Utilisateur de connexion BigQuery (roles/bigquery.connectionUser)
  • Lecteur de données BigQuery (roles/bigquery.dataViewer)
  • Utilisateur BigQuery (roles/bigquery.user)

L'appelant peut être votre compte ou un compte de service de connexion Amazon S3. Selon vos autorisations, vous pouvez vous attribuer ces rôles ou demander à votre administrateur de vous les accorder. Pour en savoir plus sur l'attribution de rôles, consultez la page Afficher les rôles pouvant être attribués sur des ressources.

Pour afficher les autorisations exactes requises pour interroger des tables BigLake Amazon S3, développez la section Autorisations requises :

Autorisations requises

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Interroger les tables BigLake Amazon S3

Après avoir créé une table BigLake Amazon S3, vous pouvez l'interroger à l'aide d'une syntaxe GoogleSQL, comme pour une table BigQuery standard.

Les résultats de requêtes mis en cache sont stockés dans une table temporaire BigQuery. Pour interroger une table BigLake temporaire, consultez la page Interroger une table BigLake temporaire. Pour en savoir plus sur les limitations et les quotas de BigQuery Omni, consultez les limites et les quotas.

Lorsque vous créez une réservation dans une région BigQuery Omni, utilisez l'édition Enterprise. Pour savoir comment créer une réservation avec une édition, consultez la section Créer des réservations.

Exécutez une requête sur une table BigLake Amazon S3 :

SQL

Pour interroger la table :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    SELECT * FROM DATASET_NAME.TABLE_NAME;
    

    Remplacez les éléments suivants :

    • DATASET_NAME : nom d'ensemble de données que vous avez créé.
    • TABLE_NAME : nom de la table que vous avez créée

    • Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CsvOptions;
import com.google.cloud.bigquery.DatasetId;
import com.google.cloud.bigquery.ExternalTableDefinition;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.TableResult;

// Sample to queries an external data source aws s3 using a permanent table
public class QueryExternalTableAws {

  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";
    // Query to find states starting with 'W'
    String query =
        String.format(
            "SELECT * FROM s%.%s.%s WHERE name LIKE 'W%%'",
            projectId, datasetName, externalTableName);
    queryExternalTableAws(query);
  }

  public static void queryExternalTableAws(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 on aws external permanent table performed successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Interroger une table temporaire

BigQuery crée des tables temporaires pour stocker les résultats de requête. Pour récupérer le résultat de la requête à partir de tables temporaires, vous pouvez utiliser la console Google Cloud ou l'API BigQuery.

Sélectionnez l'une des options suivantes :

Console

Lorsque vous interrogez une table BigLake qui référence des données cloud externes, vous pouvez afficher les résultats de la requête affichés dans la console Google Cloud.

API

Pour interroger une table BigLake en utilisant l'API, procédez comme suit:

  1. Créez un objet Tâche.
  2. Appeler la méthode jobs.insert pour exécuter la requête de manière asynchrone ou la méthode jobs.query pour exécuter la requête de manière synchrone, en transmettant l'objet Job.
  3. Lisez les lignes à l'aide de jobs.getQueryResults en transmettant la référence de job donnée, et les méthodes tabledata.list en transmettant la référence de table donnée du résultat de la requête.

Interroger la pseudo-colonne _FILE_NAME

Les tables basées sur des sources de données externes donnent accès à une pseudo-colonne intitulée _FILE_NAME. Cette colonne contient le chemin d'accès complet du fichier auquel appartient la ligne. Elle n'est disponible que pour les tables qui font référence à des données externes stockées dans Cloud Storage, Google Drive, Amazon S3 et Azure Blob Storage.

Le nom de colonne _FILE_NAME est réservé. Vous ne pouvez donc pas créer de colonne portant ce nom dans vos tables. Pour sélectionner la valeur de _FILE_NAME, vous devez utiliser un alias. Par exemple, la requête suivante sélectionne _FILE_NAME en attribuant l'alias fn à la pseudo-colonne.

  bq query \
  --project_id=PROJECT_ID \
  --use_legacy_sql=false \
  'SELECT
     name,
     _FILE_NAME AS fn
   FROM
     `DATASET.TABLE_NAME`
   WHERE
     name contains "Alex"' 

Remplacez les éléments suivants :

  • PROJECT_ID correspond à un ID de projet valide (cette option n'est pas obligatoire si vous utilisez Cloud Shell ou si vous définissez un projet par défaut dans la Google Cloud CLI).
  • DATASET correspond au nom de l'ensemble de données où est stockée la table externe permanente.
  • TABLE_NAME est le nom de la table externe permanente.

Lorsque la requête comporte un prédicat de filtre sur la pseudo-colonne _FILE_NAME, BigQuery tente d'ignorer les fichiers qui ne correspondent pas au filtre. Des recommandations similaires pour interroger des tables partitionnées par date d'ingestion à l'aide de pseudo-colonnes s'appliquent lors de la construction de prédicats de requête avec la pseudo-colonne _FILE_NAME.

Étapes suivantes