Esporta i dati delle tabelle in Cloud Storage

Questa pagina descrive come esportare o estrarre i dati dalle tabelle BigQuery in Cloud Storage.

Dopo aver caricato i dati in BigQuery, puoi esportarli in diversi formati. BigQuery può esportare fino a 1 GB di dati in un singolo file. Se esporti più di 1 GB di dati, devi esportarli in più file. Quando esportate i dati in più file, le dimensioni dei file variano.

Puoi utilizzare un servizio come Dataflow per leggere i dati da BigQuery anziché esportarli manualmente. Per maggiori informazioni sull'utilizzo di Dataflow per leggere e scrivere in BigQuery, consulta BigQuery I/O nella documentazione di Apache Beam.

Puoi anche esportare i risultati di una query utilizzando l'istruzione EXPORT DATA. Puoi utilizzare EXPORT DATA OPTIONS per esportare le visualizzazioni in Cloud Storage.

Limitazioni all'esportazione

Quando esporti i dati da BigQuery, tieni presente quanto segue:

  • Non puoi esportare i dati della tabella in un file locale, in Fogli Google o su Google Drive. L'unica posizione di esportazione supportata è Cloud Storage. Per informazioni sul salvataggio dei risultati delle query, consulta Scaricare e salvare i risultati delle query.
  • Puoi esportare fino a 1 GB di dati di tabelle in un singolo file. Se esporti più di 1 GB di dati, utilizza un'espressione generica per esportarli in più file. Quando esporti i dati in più file, le dimensioni dei file variano. Per limitare le dimensioni del file esportato, puoi partizionare i dati ed esportare ogni partizione.
  • Le dimensioni del file generate quando si utilizza l'istruzione EXPORT DATA non sono garantite.
  • Il numero di file generati da un job di esportazione può variare.
  • Non puoi esportare dati nidificati e ripetuti in formato CSV. I dati nidificati e ripetuti sono supportati per le esportazioni in Avro, JSON e Parquet.
  • Quando esporti i dati in formato JSON, i tipi di dati INT64 (numerici) vengono codificati come stringhe JSON per preservare la precisione a 64 bit quando i dati vengono letti da altri sistemi.
  • Non puoi esportare i dati da più tabelle in un unico job di esportazione.
  • Non puoi scegliere un tipo di compressione diverso da GZIP quando esporti i dati utilizzando la console Google Cloud.
  • Quando esporti i dati in un bucket Cloud Storage configurato con un regolamento sulla conservazione, BigQuery potrebbe non riuscire a scrivere i file nel bucket. Configura il periodo di conservazione in modo che sia più lungo della durata dei job di esportazione.
  • Quando esporti una tabella in formato JSON, i simboli <, > e & vengono convertiti utilizzando la notazione Unicode \uNNNN, dove N è un numero esadecimale. Ad esempio, profit&loss diventa profit\u0026loss. Questa conversione Unicode viene eseguita per evitare vulnerabilità di sicurezza.
  • L'ordine dei dati della tabella esportati non è garantito, a meno che non utilizzi l'istruzione EXPORT DATA e specifichi una clausola ORDER BY in query_statement.
  • BigQuery non supporta i percorsi delle risorse Cloud Storage che includono più barre consecutive dopo la barra doppia iniziale. I nomi degli oggetti Cloud Storage possono contenere più barre consecutive ("/"). Tuttavia, BigQuery converte più slash consecutivi in un'unica barra. Ad esempio, il seguente percorso della risorsa, sebbene valido in Cloud Storage, non funziona in BigQuery: gs://bucket/my//object//name.
  • I nuovi dati caricati in BigQuery durante l'esecuzione di un job di esportazione non verranno inclusi nel job. Devi creare un nuovo job di esportazione per esportare i nuovi dati.

Prima di iniziare

Concedi i ruoli IAM (Identity and Access Management) che assegnano agli utenti le autorizzazioni necessarie per eseguire ogni attività in questo documento.

Autorizzazioni obbligatorie

Per eseguire le attività descritte in questo documento, devi disporre delle seguenti autorizzazioni.

Autorizzazioni per esportare i dati da una tabella BigQuery

Per esportare i dati da una tabella BigQuery, devi disporre dell'bigquery.tables.exportautorizzazione IAM.

Ciascuno dei seguenti ruoli IAM predefiniti include l'autorizzazione bigquery.tables.export:

  • roles/bigquery.dataViewer
  • roles/bigquery.dataOwner
  • roles/bigquery.dataEditor
  • roles/bigquery.admin

Autorizzazioni per eseguire un job di esportazione

Per eseguire un job di esportazione, devi disporre dell'autorizzazione IAM bigquery.jobs.create.

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per eseguire un job di esportazione:

  • roles/bigquery.user
  • roles/bigquery.jobUser
  • roles/bigquery.admin

Autorizzazioni per scrivere i dati nel bucket Cloud Storage

Per scrivere i dati in un bucket Cloud Storage esistente, devi disporre delle seguenti autorizzazioni IAM:

  • storage.objects.create
  • storage.objects.delete

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per scrivere i dati in un bucket Cloud Storage esistente:

  • roles/storage.objectAdmin
  • roles/storage.admin

Per ulteriori informazioni sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Considerazioni sulla località

Colloca i bucket Cloud Storage per l'esportazione dei dati:
  • Se il set di dati BigQuery si trova nella regione multipla EU, il bucket Cloud Storage contenente i dati esportati deve trovarsi nella stessa regione multipla o in una posizione contenuta nella regione multipla. Ad esempio, se il set di dati BigQuery si trova nella regione multiregionale EU, il bucket Cloud Storage può trovarsi nella regione europe-west1 del Belgio, che fa parte dell'UE.

    Se il set di dati si trova nell'area geografica multipla US, puoi esportare i dati in un bucket Cloud Storage in qualsiasi posizione.

  • Se il set di dati si trova in una regione, il bucket Cloud Storage deve trovarsi nella stessa regione. Ad esempio, se il set di dati si trova nella regione asia-northeast1 di Tokyo, il bucket Cloud Storage non può trovarsi nella regione multipla ASIA.
Sviluppare un piano di gestione dei dati:
  • Se scegli una risorsa di archiviazione regionale, come un set di dati BigQuery o un bucket Cloud Storage, sviluppa un piano per la gestione geografica dei dati.

Per ulteriori informazioni sulle località di Cloud Storage, consulta Località dei bucket nella documentazione di Cloud Storage.

Spostare i dati BigQuery tra posizioni

Non puoi modificare la posizione di un set di dati dopo averlo creato, ma puoi crearne una copia. Non puoi spostare un set di dati da una posizione all'altra, ma puoi spostare (ricreare) manualmente un set di dati.

Formati di esportazione e tipi di compressione

BigQuery supporta i seguenti formati di dati e tipi di compressione per i dati esportati.

Formato dei dati Tipi di compressione supportati Dettagli
CSV GZIP

Puoi controllare il delimitatore CSV nei dati esportati utilizzando il flag dello strumento a riga di comando --field_delimiter bq o la proprietà del job di estrazione configuration.extract.fieldDelimiter.

I dati nidificati e ripetuti non sono supportati.

JSON GZIP I dati nidificati e ripetuti sono supportati.
Avro DEFLATE, SNAPPY

GZIP non è supportato per le esportazioni Avro.

I dati nidificati e ripetuti sono supportati. Consulta Dettagli sull'esportazione in Avro.

Parquet SNAPPY, GZIP, ZSTD

I dati nidificati e ripetuti sono supportati. Consulta Dettagli sull'esportazione in formato Parquet.

Esporta i dati

Puoi esportare i dati della tabella:

  • Utilizzo della console Google Cloud
  • Utilizzo del comando bq extract nello strumento a riga di comando bq
  • Invio di un job extract utilizzando l'API o le librerie client

Esportare i dati delle tabelle

Per esportare i dati da una tabella BigQuery:

Console

  1. Apri la pagina BigQuery nella console Google Cloud.

    Vai alla pagina BigQuery

  2. Nel riquadro Explorer, espandi il progetto e il set di dati, quindi seleziona la tabella.

  3. Nel riquadro dei dettagli, fai clic su Esporta e seleziona Esporta in Cloud Storage.

  4. Nella finestra di dialogo Esporta tabella in Google Cloud Storage:

    • In Seleziona la posizione di Google Cloud Storage, cerca il bucket, la cartella o il file in cui vuoi esportare i dati.
    • In Formato di esportazione, scegli il formato per i dati esportati: CSV, JSON (separato da riga), Avro o Parquet.
    • In Compressione, seleziona un formato di compressione o None per nessuna compressione.
    • Fai clic su Esporta per esportare la tabella. google3/googledata/devsite/site-cloud/it/bigquery/docs/introduction-sql.md Per controllare l'avanzamento del job, cerca Esporta in Cronologia job nella parte superiore del riquadro di navigazione.

Per esportare le visualizzazioni in Cloud Storage, utilizza l'istruzione EXPORT DATA OPTIONS.

SQL

Utilizza l'istruzione EXPORT DATA. L'esempio seguente esporta alcuni campi da una tabella denominata mydataset.table1:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    EXPORT DATA
      OPTIONS (
        uri = 'gs://bucket/folder/*.csv',
        format = 'CSV',
        overwrite = true,
        header = true,
        field_delimiter = ';')
    AS (
      SELECT field1, field2
      FROM mydataset.table1
      ORDER BY field1
    );

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

bq

Utilizza il comando bq extract con il flag --destination_format.

(Facoltativo) Fornisci il flag --location e imposta il valore sulla tua posizione.

Altri flag facoltativi sono:

  • --compression: il tipo di compressione da utilizzare per i file esportati.
  • --field_delimiter: il carattere che indica il confine tra le colonne nel file di output per le esportazioni in formato CSV. Sia \t che tab sono consentiti per i delimitatori di tabulazione.
  • --print_header: se specificato, stampa le righe di intestazione per i formati che hanno intestazioni, ad esempio CSV.
bq extract --location=location \
--destination_format format \
--compression compression_type \
--field_delimiter delimiter \
--print_header=boolean \
project_id:dataset.table \
gs://bucket/filename.ext

Dove:

  • location è il nome della tua sede. Il flag --location è facoltativo. Ad esempio, se utilizzi BigQuery nella regione di Tokyo, puoi impostare il valore del flag su asia-northeast1. Puoi impostare un valore predefinito per la posizione utilizzando il file.bigqueryrc.
  • format è il formato dei dati esportati: CSV, NEWLINE_DELIMITED_JSON, AVRO o PARQUET.
  • compression_type è un tipo di compressione supportato per il formato dei dati. Consulta Formati di esportazione e tipi di compressione.
  • delimiter è il carattere che indica il confine tra le colonne nelle esportazioni in formato CSV. \t e tab sono nomi accettati per la scheda.
  • boolean è true o false. Se impostato su true, le righe di intestazione vengono stampate nei dati esportati se il formato dei dati supporta le intestazioni. Il valore predefinito è true.
  • project_id è l'ID progetto.
  • dataset è il nome del set di dati di origine.
  • table è la tabella che stai esportando. Se utilizzi un decoratore della partizione, devi racchiudere il percorso della tabella tra virgolette singole o evitare il carattere $.
  • bucket è il nome del bucket Cloud Storage a cui stai esportando i dati. Il set di dati BigQuery e il bucket Cloud Storage devono trovarsi nella stessa località.
  • filename.ext è il nome e l'estensione del file di dati esportato. Puoi esportare in più file utilizzando un carattere jolly.

Esempi:

Ad esempio, il seguente comando esporta mydataset.mytable in un file compresso con gzip denominato myfile.csv. myfile.csv è archiviato in un bucket Cloud Storage denominato example-bucket.

bq extract \
--compression GZIP \
'mydataset.mytable' \
gs://example-bucket/myfile.csv

Il formato di destinazione predefinito è CSV. Per esportare in JSON o Avro, utilizza il destination_format flag e impostalo su NEWLINE_DELIMITED_JSON o AVRO. Ad esempio:

bq extract \
--destination_format NEWLINE_DELIMITED_JSON \
'mydataset.mytable' \
gs://example-bucket/myfile.json

Il comando seguente esporta mydataset.mytable in un file Avro compresso utilizzando Snappy. Il file si chiama myfile.avro. myfile.avro viene esportato in un bucket Cloud Storage denominato example-bucket.

bq extract \
--destination_format AVRO \
--compression SNAPPY \
'mydataset.mytable' \
gs://example-bucket/myfile.avro

Il seguente comando esporta una singola partizione dimydataset.my_partitioned_table in un file CSV in Cloud Storage:

bq extract \
--destination_format CSV \
'mydataset.my_partitioned_table$0' \
gs://example-bucket/single_partition.csv

API

Per esportare i dati, crea un job extract e compila la relativa configurazione.

(Facoltativo) Specifica la tua posizione nella proprietà location nella sezione jobReference della risorsa job.

  1. Crea un job di estrazione che indichi i dati di origine BigQuery e la destinazione Cloud Storage.

  2. Specifica la tabella di origine utilizzando l'oggetto di configurazione sourceTable che contiene l'ID progetto, l'ID set di dati e l'ID tabella.

  3. La proprietà destination URI(s) deve essere completa, nel formato gs://bucket/filename.ext. Ogni URI può contenere un carattere jolly "*" e deve essere visualizzato dopo il nome del bucket.

  4. Specifica il formato dei dati impostando la proprietà configuration.extract.destinationFormat. Ad esempio, per esportare un file JSON, imposta questa proprietà sul valore NEWLINE_DELIMITED_JSON.

  5. Per controllare lo stato del job, chiama jobs.get(job_id) con l'ID del job restituito dalla richiesta iniziale.

    • Se status.state = DONE, il job è stato completato correttamente.
    • Se la proprietà status.errorResult è presente, la richiesta non è riuscita e l'oggetto includerà informazioni che descrivono il problema.
    • Se status.errorResult non è presente, il job è stato completato correttamente, anche se potrebbero essere stati generati alcuni errori non fatali. Gli errori non fatali sono elencati nella proprietà status.errors dell'oggetto job restituito.

Note sull'API:

  • Come best practice, genera un ID univoco e passalo come jobReference.jobId quando chiami jobs.insert per creare un job. Questo approccio è più robusto in caso di errori di rete perché il client può eseguire poll o ritentare con l'ID job noto.

  • La chiamata a jobs.insert su un determinato ID job è idempotente; in altre parole, puoi ritentare tutte le volte che vuoi con lo stesso ID job e al massimo una di queste operazioni andrà a buon fine.

C#

Prima di provare questo esempio, segui le istruzioni di configurazione C# riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery C#.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryExtractTable
{
    public void ExtractTable(
        string projectId = "your-project-id",
        string bucketName = "your-bucket-name")
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        // Define a destination URI. Use a single wildcard URI if you think
        // your exported data will be larger than the 1 GB maximum value.
        string destinationUri = $"gs://{bucketName}/shakespeare-*.csv";
        BigQueryJob job = client.CreateExtractJob(
            projectId: "bigquery-public-data",
            datasetId: "samples",
            tableId: "shakespeare",
            destinationUri: destinationUri
        );
        job = job.PollUntilCompleted().ThrowOnAnyError();  // Waits for the job to complete.
        Console.Write($"Exported table to {destinationUri}.");
    }
}

Vai

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// exportTableAsCompressedCSV demonstrates using an export job to
// write the contents of a table into Cloud Storage as CSV.
func exportTableAsCSV(projectID, gcsURI string) error {
	// projectID := "my-project-id"
	// gcsUri := "gs://mybucket/shakespeare.csv"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	srcProject := "bigquery-public-data"
	srcDataset := "samples"
	srcTable := "shakespeare"

	gcsRef := bigquery.NewGCSReference(gcsURI)
	gcsRef.FieldDelimiter = ","

	extractor := client.DatasetInProject(srcProject, srcDataset).Table(srcTable).ExtractorTo(gcsRef)
	extractor.DisableHeader = true
	// You can choose to run the job in a specific location for more complex data locality scenarios.
	// Ex: In this example, source dataset and GCS bucket are in the US.
	extractor.Location = "US"

	job, err := extractor.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.RetryOption;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;
import org.threeten.bp.Duration;

public class ExtractTableToCsv {

  public static void runExtractTableToCsv() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "bigquery-public-data";
    String datasetName = "samples";
    String tableName = "shakespeare";
    String bucketName = "my-bucket";
    String destinationUri = "gs://" + bucketName + "/path/to/file";
    // For more information on export formats available see:
    // https://cloud.google.com/bigquery/docs/exporting-data#export_formats_and_compression_types
    // For more information on Job see:
    // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html

    String dataFormat = "CSV";
    extractTableToCsv(projectId, datasetName, tableName, destinationUri, dataFormat);
  }

  // Exports datasetName:tableName to destinationUri as raw CSV
  public static void extractTableToCsv(
      String projectId,
      String datasetName,
      String tableName,
      String destinationUri,
      String dataFormat) {
    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();

      TableId tableId = TableId.of(projectId, datasetName, tableName);
      Table table = bigquery.getTable(tableId);

      Job job = table.extract(dataFormat, destinationUri);

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob =
          job.waitFor(
              RetryOption.initialRetryDelay(Duration.ofSeconds(1)),
              RetryOption.totalTimeout(Duration.ofMinutes(3)));
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to extract due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println(
          "Table export successful. Check in GCS bucket for the " + dataFormat + " file.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table extraction job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

Prima di provare questo esempio, segui le istruzioni di configurazione Node.js riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Node.js.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

const bigquery = new BigQuery();
const storage = new Storage();

async function extractTableToGCS() {
  // Exports my_dataset:my_table to gcs://my-bucket/my-file as raw CSV.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";
  // const bucketName = "my-bucket";
  // const filename = "file.csv";

  // Location must match that of the source table.
  const options = {
    location: 'US',
  };

  // Export data from the table into a Google Cloud Storage file
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .extract(storage.bucket(bucketName).file(filename), options);

  console.log(`Job ${job.id} created.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

Prima di provare questo esempio, segui le istruzioni di configurazione PHP riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery PHP.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

use Google\Cloud\BigQuery\BigQueryClient;

/**
 * Extracts the given table as json to given GCS bucket.
 *
 * @param string $projectId The project Id of your Google Cloud Project.
 * @param string $datasetId The BigQuery dataset ID.
 * @param string $tableId The BigQuery table ID.
 * @param string $bucketName Bucket name in Google Cloud Storage
 */
function extract_table(
    string $projectId,
    string $datasetId,
    string $tableId,
    string $bucketName
): void {
    $bigQuery = new BigQueryClient([
      'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table($tableId);
    $destinationUri = "gs://{$bucketName}/{$tableId}.json";
    // Define the format to use. If the format is not specified, 'CSV' will be used.
    $format = 'NEWLINE_DELIMITED_JSON';
    // Create the extract job
    $extractConfig = $table->extract($destinationUri)->destinationFormat($format);
    // Run the job
    $job = $table->runJob($extractConfig);  // Waits for the job to complete
    printf('Exported %s to %s' . PHP_EOL, $table->id(), $destinationUri);
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

# from google.cloud import bigquery
# client = bigquery.Client()
# bucket_name = 'my-bucket'
project = "bigquery-public-data"
dataset_id = "samples"
table_id = "shakespeare"

destination_uri = "gs://{}/{}".format(bucket_name, "shakespeare.csv")
dataset_ref = bigquery.DatasetReference(project, dataset_id)
table_ref = dataset_ref.table(table_id)

extract_job = client.extract_table(
    table_ref,
    destination_uri,
    # Location must match that of the source table.
    location="US",
)  # API request
extract_job.result()  # Waits for job to complete.

print(
    "Exported {}:{}.{} to {}".format(project, dataset_id, table_id, destination_uri)
)

Ruby

Prima di provare questo esempio, segui le istruzioni di configurazione Ruby riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Ruby.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

require "google/cloud/bigquery"

def extract_table bucket_name = "my-bucket",
                  dataset_id  = "my_dataset_id",
                  table_id    = "my_table_id"

  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table    table_id

  # Define a destination URI. Use a single wildcard URI if you think
  # your exported data will be larger than the 1 GB maximum value.
  destination_uri = "gs://#{bucket_name}/output-*.csv"

  extract_job = table.extract_job destination_uri do |config|
    # Location must match that of the source table.
    config.location = "US"
  end
  extract_job.wait_until_done! # Waits for the job to complete

  puts "Exported #{table.id} to #{destination_uri}"
end

Dettagli esportazione in Avro

BigQuery esprime i dati nel formato Avro nei seguenti modi:

  • I file di esportazione risultanti sono file contenitore Avro.
  • Ogni riga di BigQuery è rappresentata come un record Avro. I dati nidificati sono rappresentati da oggetti record nidificati.
  • I campi REQUIRED sono rappresentati come i tipi Avro corrispondenti. Ad esempio, un tipo INTEGER BigQuery viene mappato a un tipo LONG Avro.
  • I campi NULLABLE sono rappresentati come un'unione Avro del tipo corrispondente e "null".
  • I campi REPEATED sono rappresentati come array Avro.
  • Per impostazione predefinita, i tipi di dati TIMESTAMP sono rappresentati come tipo logico timestamp-micros (annotano un tipo Avro LONG) sia nei job di estrazione sia in SQL Export Data. Attenzione: puoi aggiungere use_avro_logical_types=False a Export Data Options per disattivare il tipo logico in modo da utilizzare il tipo string invece della colonna del timestamp, ma nei job di estrazione viene sempre utilizzato il tipo logico Avro.
  • I tipi di dati DATE sono rappresentati come tipo logico date (annotano un tipo Avro INT) per impostazione predefinita in SQL di esportazione dei dati, ma sono rappresentati come tipo string per impostazione predefinita nei job di estrazione. Nota: puoi aggiungere use_avro_logical_types=False a Export Data Options per disattivare il tipo logico o utilizzare il flag --use_avro_logical_types=True per attivarlo nei job di estrazione.
  • I tipi di dati TIME sono rappresentati come tipo logico timestamp-micro (annotano un tipo Avro LONG) per impostazione predefinita in SQL di esportazione dei dati, ma sono rappresentati come tipo string per impostazione predefinita nei job di estrazione. Nota: puoi aggiungere use_avro_logical_types=False a Export Data Options per disattivare il tipo logico o utilizzare il flag --use_avro_logical_types=True per attivarlo nei job di estrazione.
  • Per impostazione predefinita, in Export Data SQL i tipi di dati DATETIME sono rappresentati come tipi Avro STRING (un tipo di stringa con tipo logico denominato personalizzato datetime), ma per impostazione predefinita nei job di estrazione sono rappresentati come tipo string. Nota: puoi aggiungere use_avro_logical_types=False a Export Data Options per disattivare il tipo logico o utilizzare il flag --use_avro_logical_types=True per attivare il tipo logico nei job di estrazione.
  • I tipi RANGE non sono supportati nell'esportazione in Avro.

I tipi di dati parametrici NUMERIC(P[, S]) e BIGNUMERIC(P[, S]) trasferiscono i parametri di precisione e tipo di scala al tipo logico decimale Avro.

Il formato Avro non può essere utilizzato in combinazione con la compressione GZIP. Per comprimere i dati Avro, utilizza lo strumento a riga di comando bq o l'API e specifica uno dei tipi di compressione supportati per i dati Avro: DEFLATE o SNAPPY.

Dettagli esportazione in formato parquet

BigQuery converte i tipi di dati GoogleSQL nei seguenti tipi di dati Parquet:

Tipo di dati BigQuery Tipo di primitivo Parquet Tipo logico Parquet
Numero intero INT64 NONE
Numerico FIXED_LEN_BYTE_ARRAY DECIMAL (precision = 38, scale = 9)
Numerico(P[, S]) FIXED_LEN_BYTE_ARRAY DECIMAL (precision = P, scale = S)
BigNumeric FIXED_LEN_BYTE_ARRAY DECIMAL (precision = 76, scale = 38)
BigNumeric(P[, S]) FIXED_LEN_BYTE_ARRAY DECIMAL (precision = P, scale = S)
Virgola mobile FLOAT NONE
Booleano BOOLEAN NONE
Stringa BYTE_ARRAY STRING (UTF8)
Byte BYTE_ARRAY NONE
Data INT32 DATE
Data/ora INT64 TIMESTAMP (isAdjustedToUTC = false, unit = MICROS)
Ora INT64 TIME (isAdjustedToUTC = true, unit = MICROS)
Timestamp INT64 TIMESTAMP (isAdjustedToUTC = false, unit = MICROS)
Area geografica BYTE_ARRAY GEOGRAPHY (edges = spherical)

Lo schema Parquet rappresenta i dati nidificati come gruppo e i record ripetuti come gruppi ripetuti. Per ulteriori informazioni sull'utilizzo di dati nidificati e ripetuti in BigQuery, consulta Specificare colonne nidificate e ripetute.

Puoi utilizzare le seguenti soluzioni alternative per i tipi DATETIME:

  • Carica il file in una tabella intermedia. Quindi, utilizza una query SQL per eseguire il casting del campo in un valore DATETIME e salva il risultato in una nuova tabella. Per ulteriori informazioni, consulta Modificare il tipo di dati di una colonna.
  • Fornisci uno schema per la tabella utilizzando il flag --schema nel job di caricamento. Definisci la colonna data/ora come col:DATETIME.

Il tipo logico GEOGRAPHY è rappresentato con i metadati GeoParquet aggiunti ai file esportati.

Esportazione dei dati in uno o più file

La proprietà destinationUris indica una o più posizioni e nomi file in cui BigQuery deve esportare i file.

BigQuery supporta un singolo operatore jolly (*) in ogni URI. Il carattere jolly può comparire in qualsiasi punto dell'URI, tranne che nel nome del bucket. L'utilizzo dell'operatore di carattere jolly indica a BigQuery di creare più file suddivisi in base al pattern fornito. L'operatore jolly viene sostituito con un numero (a partire da 0), con zeri iniziali fino a 12 cifre. Ad esempio, un URI con un carattere jolly alla fine del nome file crea file con 000000000000 aggiunto al primo file e 000000000001 aggiunto al secondo file, continuando con questo schema.

La tabella seguente descrive diverse opzioni possibili per la proprietà destinationUris:

Opzioni destinationUris
URI singolo

Utilizza un singolo URI se esporti dati di tabelle di dimensioni pari o inferiori a 1 GB. Questa opzione è il caso d'uso più comune, poiché i dati esportati sono generalmente inferiori al valore massimo di 1 GB. Questa opzione non è supportata per l' istruzione EXPORT DATA. Devi utilizzare un singolo URI con caratteri jolly.

Definizione della proprietà:

['gs://my-bucket/file-name.json']

Crea:

gs://my-bucket/file-name.json
Un singolo URI con caratteri jolly

Utilizza un singolo URI jolly se ritieni che i dati esportati saranno superiori al valore massimo di 1 GB. BigQuery suddivide i dati in più file in base al pattern fornito. Le dimensioni dei file esportati varieranno.

Se utilizzi un carattere jolly in un componente URI diverso dal nome file, assicurati che il componente del percorso non esista prima di esportare i dati.

Definizione della proprietà:

['gs://my-bucket/file-name-*.json']

Crea:

gs://my-bucket/file-name-000000000000.json
gs://my-bucket/file-name-000000000001.json
gs://my-bucket/file-name-000000000002.json
...

Limitare le dimensioni del file esportato

Quando esporti più di 1 GB di dati in un'unica esportazione, devi utilizzare un carattere jolly per esportare i dati in più file e le dimensioni dei file variano. Se devi limitare la dimensione massima di ogni file esportato, un'opzione è suddividere in modo casuale i dati ed esportare ogni partizione in un file:

  1. Determina il numero di partizioni necessarie, che corrisponde alle dimensioni totali dei dati divise per le dimensioni del file esportato scelto. Ad esempio, se hai 8000 MB di dati e vuoi che ogni file esportato abbia circa 20 MB, hai bisogno di 400 partizioni.
  2. Crea una nuova tabella partizionata e raggruppata in cluster in base a una nuova colonna generata in modo casuale denominata export_id. L'esempio seguente mostra come creare un nuovo processed_table da una tabella esistente denominata source_table che richiede n partizioni per raggiungere la dimensione del file scelta:

    CREATE TABLE my_dataset.processed_table
    PARTITION BY RANGE_BUCKET(export_id, GENERATE_ARRAY(0, n, 1))
    CLUSTER BY export_id
    AS (
      SELECT *, CAST(FLOOR(n*RAND()) AS INT64) AS export_id
      FROM my_dataset.source_table
    );
  3. Per ogni numero intero i compreso tra 0 e n-1, esegui un'istruzione EXPORT DATA sulla seguente query:

    SELECT * EXCEPT(export_id)
    FROM my_dataset.processed_table
    WHERE export_id = i;

Estrai la tabella compressa

Go

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// exportTableAsCompressedCSV demonstrates using an export job to
// write the contents of a table into Cloud Storage as compressed CSV.
func exportTableAsCompressedCSV(projectID, gcsURI string) error {
	// projectID := "my-project-id"
	// gcsURI := "gs://mybucket/shakespeare.csv"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

	srcProject := "bigquery-public-data"
	srcDataset := "samples"
	srcTable := "shakespeare"

	gcsRef := bigquery.NewGCSReference(gcsURI)
	gcsRef.Compression = bigquery.Gzip

	extractor := client.DatasetInProject(srcProject, srcDataset).Table(srcTable).ExtractorTo(gcsRef)
	extractor.DisableHeader = true
	// You can choose to run the job in a specific location for more complex data locality scenarios.
	// Ex: In this example, source dataset and GCS bucket are in the US.
	extractor.Location = "US"

	job, err := extractor.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.ExtractJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

// Sample to extract a compressed table
public class ExtractTableCompressed {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String projectName = "MY_PROJECT_NAME";
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String bucketName = "MY-BUCKET-NAME";
    String destinationUri = "gs://" + bucketName + "/path/to/file";
    // For more information on export formats available see:
    // https://cloud.google.com/bigquery/docs/exporting-data#export_formats_and_compression_types
    String compressed = "gzip";
    // For more information on Job see:
    // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
    String dataFormat = "CSV";

    extractTableCompressed(
        projectName, datasetName, tableName, destinationUri, dataFormat, compressed);
  }

  public static void extractTableCompressed(
      String projectName,
      String datasetName,
      String tableName,
      String destinationUri,
      String dataFormat,
      String compressed) {
    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();

      TableId tableId = TableId.of(projectName, datasetName, tableName);

      ExtractJobConfiguration extractConfig =
          ExtractJobConfiguration.newBuilder(tableId, destinationUri)
              .setCompression(compressed)
              .setFormat(dataFormat)
              .build();

      Job job = bigquery.create(JobInfo.of(extractConfig));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to extract due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table extract compressed successful");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table extraction job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

Prima di provare questo esempio, segui le istruzioni di configurazione Node.js riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Node.js.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

const bigquery = new BigQuery();
const storage = new Storage();

async function extractTableCompressed() {
  // Exports my_dataset:my_table to gcs://my-bucket/my-file as a compressed file.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";
  // const bucketName = "my-bucket";
  // const filename = "file.csv";

  // Location must match that of the source table.
  const options = {
    location: 'US',
    gzip: true,
  };

  // Export data from the table into a Google Cloud Storage file
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .extract(storage.bucket(bucketName).file(filename), options);

  console.log(`Job ${job.id} created.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

# from google.cloud import bigquery
# client = bigquery.Client()
# bucket_name = 'my-bucket'

destination_uri = "gs://{}/{}".format(bucket_name, "shakespeare.csv.gz")
dataset_ref = bigquery.DatasetReference(project, dataset_id)
table_ref = dataset_ref.table("shakespeare")
job_config = bigquery.job.ExtractJobConfig()
job_config.compression = bigquery.Compression.GZIP

extract_job = client.extract_table(
    table_ref,
    destination_uri,
    # Location must match that of the source table.
    location="US",
    job_config=job_config,
)  # API request
extract_job.result()  # Waits for job to complete.

Esportare i metadati della tabella

Per esportare i metadati della tabella da una tabella gestita BigLake, utilizza la seguente istruzione SQL:

EXPORT TABLE METADATA FROM `[[PROJECT_NAME.]DATASET_NAME.]TABLE_NAME`;

Sostituisci quanto segue:

  • PROJECT_NAME: il nome del progetto per la tabella. Il valore predefinito è il progetto che esegue questa query.
  • DATASET_NAME: il nome del set di dati per la tabella.
  • TABLE_NAME: il nome della tabella.

I metadati esportati si trovano nella cartella STORAGE_URI/metadata, dove STORAGE_URI è la posizione di archiviazione della tabella impostata nelle opzioni.

Caso d'uso di esempio

Questo esempio mostra come esportare i dati in Cloud Storage.

Supponiamo che tu stia trasmettendo in streaming i dati in Cloud Storage dai log degli endpoint continuamente. Uno snapshot giornaliero deve essere esportato in Cloud Storage per scopi di backup e archiviazione. La scelta migliore è un job di estrazione sometido a determinate quote e limitazioni.

Invia un job di estrazione con l'API o le librerie client, passando un ID univoco come jobReference.jobId. I job di estrazione sono asincroni. Controlla lo stato del job utilizzando l'ID univoco del job utilizzato per crearlo. Il job è stato completato correttamente se status.status è DONE. Se è presente status.errorResult, il job non è riuscito e deve essere riprovato.

Elaborazione dei dati in batch

Supponiamo che venga utilizzato un job batch notturno per caricare i dati entro una scadenza fissa. Al termine di questo job di caricamento, viene visualizzata una tabella con le statistiche da una query come descritto nella sezione precedente. I dati di questa tabella vengono recuperati e compilati in un report PDF e inviati a un ente regolatore.

Poiché la quantità di dati da leggere è ridotta, utilizza l'API tabledata.list per recuperare tutte le righe della tabella in formato dizionario JSON. Se sono presenti più di una pagina di dati, i risultati hanno la proprietà pageToken impostata. Per recuperare la pagina di risultati successiva, effettua un'altra chiamata tabledata.list e includi il valore del token come parametro pageToken. Se la chiamata all'API non va a buon fine con un errore 5xx, riprova con il backoff esponenziale. Per la maggior parte degli errori 4xx non è possibile riprovare. Per un migliore disaccoppiamento dell'esportazione BigQuery e della generazione di report, i risultati devono essere mantenuti sul disco.

Criteri per le quote

Per informazioni sulle quote dei job di esportazione, consulta Job di esportazione nella pagina Quote e limiti.

L'utilizzo dei job di esportazione è disponibile in INFORMATION_SCHEMA. La voce del job nelle tabelle di sistema JOBS_BY_* per il job di esportazione contiene un valore total_processed_bytes che può essere utilizzato per monitorare l'utilizzo aggregato in modo che rimanga al di sotto di 50 TiB al giorno. Per scoprire come eseguire query sulla vista INFORMATION_SCHEMA.JOBS per ottenere il valore total_processed_bytes, consulta Ottenere i byte elaborati dai job di esportazione.

Visualizzare l'utilizzo attuale delle quote

Puoi visualizzare l'utilizzo corrente dei job di query, caricamento, estrazione o copia eseguendo una query INFORMATION_SCHEMA per visualizzare i metadati dei job eseguiti in un periodo di tempo specificato. Puoi confrontare l'utilizzo corrente con il limite di quota per determinare l'utilizzo della quota per un determinato tipo di job. La seguente query di esempio utilizza la vista INFORMATION_SCHEMA.JOBS per elencare il numero di job di query, caricamento, estrazione e copia per progetto:

SELECT
  sum(case  when job_type="QUERY" then 1 else 0 end) as QRY_CNT,
  sum(case  when job_type="LOAD" then 1 else 0 end) as LOAD_CNT,
  sum(case  when job_type="EXTRACT" then 1 else 0 end) as EXT_CNT,
  sum(case  when job_type="COPY" then 1 else 0 end) as CPY_CNT
FROM `region-eu`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE date(creation_time)= CURRENT_DATE()

Puoi configurare un criterio di avviso di Cloud Monitoring che fornisce una notifica del numero di byte esportati.

  1. Nella console Google Cloud, vai alla pagina Monitoring.

    Vai a Monitoring

  2. Nel riquadro di navigazione, seleziona Metrics Explorer.

  3. Nell'editor delle query MQL, configura un avviso per monitorare i byte esportati al giorno, come mostrato nell'esempio seguente:

    fetch consumer_quota
      | filter resource.service == 'bigquery.googleapis.com'
      | { metric serviceruntime.googleapis.com/quota/rate/net_usage
          | align delta_gauge(1m)
          | group_by [resource.project_id, metric.quota_metric, resource.location],
              sum(value.net_usage)
        ; metric serviceruntime.googleapis.com/quota/limit
          | filter metric.limit_name == 'ExtractBytesPerDay'
          | group_by [resource.project_id, metric.quota_metric, resource.location],
              sliding(1m), max(val()) }
      | ratio
      | every 1m
      | condition gt(val(), 0.01 '1')
    
  4. Per configurare l'avviso, fai clic su Esegui query.

Per ulteriori informazioni, consulta Criteri di avviso con MQL.

Risoluzione dei problemi

Per diagnosticare i problemi relativi ai job di estrazione, puoi utilizzare Logs Explorer per esaminare i log di un job di estrazione specifico e identificare possibili errori. Il seguente filtro di Esplora log restituisce informazioni sui job di estrazione:

resource.type="bigquery_resource"
protoPayload.methodName="jobservice.insert"
(protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.query.query=~"EXPORT" OR
protoPayload.serviceData.jobCompletedEvent.eventName="extract_job_completed" OR
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.query=~"EXPORT")

Prezzi

Per informazioni sui prezzi dell'esportazione dei dati, consulta la pagina Prezzi di BigQuery.

Una volta esportati, ti vengono addebitati i costi per l'archiviazione dei dati in Cloud Storage. Per maggiori informazioni, consulta la pagina Prezzi di Cloud Storage.

Sicurezza della tabella

Per controllare l'accesso alle tabelle in BigQuery, consulta Introduzione ai controlli di accesso alle tabelle.

Passaggi successivi