Carica i dati con operazioni cross-cloud

In qualità di amministratore o analista BigQuery, puoi caricare i dati da un bucket Amazon Simple Storage Service (Amazon S3) o Archiviazione BLOB di Azure nelle tabelle BigQuery. Puoi unire i dati trasferiti ai dati presenti nelle regioni di Google Cloud o sfruttare funzionalità di BigQuery come BigQuery ML.

Puoi trasferire i dati in BigQuery nei seguenti modi:

Quote e limiti

Per informazioni su quote e limiti, consulta Quote e limiti dei job di query.

Prezzi

Ti vengono addebitati i byte trasferiti tra i cloud utilizzando l'istruzione LOAD. Per informazioni sui prezzi, consulta la sezione relativa a Omni Cross Cloud Data Transfer in Prezzi di BigQuery Omni.

Ti vengono addebitati i byte trasferiti tra i cloud utilizzando l'istruzione CREATE TABLE AS SELECT o l'istruzione INSERT INTO SELECT e la capacità di calcolo.

Entrambe le istruzioni LOAD e CREATE TABLE AS SELECT richiedono slot nelle regioni BigQuery Omni per analizzare i file di Amazon S3 e di Archiviazione BLOB e caricarli. Per saperne di più, consulta la pagina relativa ai prezzi di BigQuery Omni.

Prima di iniziare

Per fornire a Google Cloud l'accesso in lettura ai file in altri cloud, chiedi all'amministratore di creare una connessione e di condividerla con te. Per informazioni su come creare connessioni, consulta Connessione ad Amazon S3 o Archiviazione BLOB.

Ruolo richiesto

Per ottenere le autorizzazioni necessarie per caricare i dati utilizzando i trasferimenti tra cloud, chiedi all'amministratore di concederti il ruolo IAM Editor dati BigQuery (roles/bigquery.dataEditor) sul set di dati. Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Questo ruolo predefinito contiene le autorizzazioni necessarie per caricare i dati utilizzando i trasferimenti tra cloud. Per visualizzare le autorizzazioni esatte necessarie, espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

Per caricare dati utilizzando i trasferimenti tra cloud sono necessarie le seguenti autorizzazioni:

  • bigquery.tables.create
  • bigquery.tables.get
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create
  • bigquery.connections.use

Potresti anche essere in grado di ottenere queste autorizzazioni con i ruoli personalizzati o altri ruoli predefiniti.

Per ulteriori informazioni sui ruoli IAM in BigQuery, consulta Autorizzazioni e ruoli predefiniti.

Carica dati

Puoi caricare dati in BigQuery con l'istruzione LOAD DATA [INTO|OVERWRITE].

Limitazioni

  • Il caricamento dei dati in una tabella di destinazione con partizione del tempo di importazione non è supportato.
  • LOAD DATA job non vengono eseguiti sulle prenotazioni. I job usano slot on demand gestiti da Google Cloud.
  • La connessione e il set di dati di destinazione devono appartenere allo stesso progetto. Il caricamento dei dati tra progetti non è supportato.
  • LOAD DATA è supportato solo quando trasferisci dati da un Amazon Simple Storage Service (Amazon S3) o Archiviazione BLOB di Azure a una regione BigQuery condivisa. Per ulteriori informazioni, consulta la sezione Località.
    • Puoi trasferire i dati da qualsiasi regione US a una località US con più regioni. Puoi anche trasferire file da qualsiasi regione EU a una località con più regioni EU.

Esempio

Esempio 1

L'esempio seguente carica un file parquet denominato sample.parquet da un bucket Amazon S3 nella tabella test_parquet con uno schema di rilevamento automatico:

LOAD DATA INTO mydataset.testparquet
  FROM FILES (
    uris = ['s3://test-bucket/sample.parquet'],
    format = 'PARQUET'
  )
  WITH CONNECTION `aws-us-east-1.test-connection`

Esempio 2

L'esempio seguente carica un file CSV con il prefisso sampled* da Blob Storage nella tabella test_csv con il partizionamento predefinito delle colonne in base al tempo:

LOAD DATA INTO mydataset.test_csv (Number INT64, Name STRING, Time DATE)
  PARTITION BY Time
  FROM FILES (
    format = 'CSV', uris = ['azure://test.blob.core.windows.net/container/sampled*'],
    skip_leading_rows=1
  )
  WITH CONNECTION `azure-eastus2.test-connection`

Esempio 3

L'esempio seguente sovrascrive la tabella esistente test_parquet con i dati di un file denominato sample.parquet con uno schema di rilevamento automatico:

LOAD DATA OVERWRITE mydataset.testparquet
  FROM FILES (
    uris = ['s3://test-bucket/sample.parquet'],
    format = 'PARQUET'
  )
  WITH CONNECTION `aws-us-east-1.test-connection`

Filtra dati

Puoi filtrare i dati prima di trasferirli in BigQuery utilizzando l'istruzione CREATE TABLE AS SELECT e l'istruzione INSERT INTO SELECT.

Limitazioni

  • Se il risultato della query SELECT supera i 20 GiB in byte logici, la query non riesce. La tabella non viene creata e i dati non vengono trasferiti. Per scoprire come ridurre le dimensioni dei dati analizzati, consulta Ridurre i dati elaborati nelle query.

  • Le tabelle temporanee non sono supportate.

  • Il trasferimento del formato dei dati geospaziali Well-known Binario (WKB) non è supportato.

  • L'istruzione INSERT INTO SELECT non supporta il trasferimento di dati in una tabella in cluster.

  • Nell'istruzione INSERT INTO SELECT, se la tabella di destinazione corrisponde a quella di origine nella query SELECT, l'istruzione INSERT INTO SELECT non modifica nessuna riga nella tabella di destinazione. La tabella di destinazione non viene modificata perché BigQuery non può leggere i dati nelle varie regioni.

  • CREATE TABLE AS SELECT e INSERT INTO SELECT sono supportati solo quando trasferisci dati da un Amazon S3 o Archiviazione BLOB a una regione BigQuery condivisa. Per ulteriori informazioni, consulta la sezione Località.

    • Puoi trasferire i dati da qualsiasi regione US a una località US con più regioni. Puoi anche trasferire file da qualsiasi regione EU a una località con più regioni EU.

Esempio

Esempio 1

Supponi di avere una tabella BigLake denominata myawsdataset.orders che fa riferimento ai dati di Amazon S3. Vuoi trasferire i dati da quella tabella a una tabella BigQuery myotherdataset.shipments nella località multiregionale degli Stati Uniti.

Innanzitutto, visualizza le informazioni sulla tabella myawsdataset.orders:

    bq show myawsdataset.orders;

L'output è simile al seguente:

  Last modified             Schema              Type     Total URIs   Expiration
----------------- -------------------------- ---------- ------------ -----------
  31 Oct 17:40:28   |- l_orderkey: integer     EXTERNAL   1
                    |- l_partkey: integer
                    |- l_suppkey: integer
                    |- l_linenumber: integer
                    |- l_returnflag: string
                    |- l_linestatus: string
                    |- l_commitdate: date

Quindi, visualizza le informazioni sulla tabella myotherdataset.shipments:

  bq show myotherdataset.shipments

L'output è simile al seguente. Alcune colonne vengono omesse per semplificare l'output.

  Last modified             Schema             Total Rows   Total Bytes   Expiration   Time Partitioning   Clustered Fields   Total Logical
 ----------------- --------------------------- ------------ ------------- ------------ ------------------- ------------------ ---------------
  31 Oct 17:34:31   |- l_orderkey: integer      3086653      210767042                                                         210767042
                    |- l_partkey: integer
                    |- l_suppkey: integer
                    |- l_commitdate: date
                    |- l_shipdate: date
                    |- l_receiptdate: date
                    |- l_shipinstruct: string
                    |- l_shipmode: string

Ora, utilizzando l'istruzione CREATE TABLE AS SELECT puoi caricare selettivamente i dati nella tabella myotherdataset.orders nella località multiregionale degli Stati Uniti:

CREATE OR REPLACE TABLE
  myotherdataset.orders
  PARTITION BY DATE_TRUNC(l_commitdate, YEAR) AS
SELECT
  *
FROM
  myawsdataset.orders
WHERE
  EXTRACT(YEAR FROM l_commitdate) = 1992;

Puoi quindi eseguire un'operazione di join con la tabella appena creata:

SELECT
  orders.l_orderkey,
  orders.l_orderkey,
  orders.l_suppkey,
  orders.l_commitdate,
  orders.l_returnflag,
  shipments.l_shipmode,
  shipments.l_shipinstruct
FROM
  myotherdataset.shipments
JOIN
  `myotherdataset.orders` as orders
ON
  orders.l_orderkey = shipments.l_orderkey
AND orders.l_partkey = shipments.l_partkey
AND orders.l_suppkey = shipments.l_suppkey
WHERE orders.l_returnflag = 'R'; -- 'R' means refunded.

Quando sono disponibili nuovi dati, aggiungi i dati dell'anno 1993 alla tabella di destinazione utilizzando l'istruzione INSERT INTO SELECT:

INSERT INTO
   myotherdataset.orders
 SELECT
   *
 FROM
   myawsdataset.orders
 WHERE
   EXTRACT(YEAR FROM l_commitdate) = 1993;

Esempio 2

Nell'esempio seguente vengono inseriti dati in una tabella partizionata per data di importazione:

CREATE TABLE
 mydataset.orders(id String, numeric_id INT)
PARTITION BY _PARTITIONDATE;

Dopo aver creato una tabella partizionata, puoi inserire i dati nella tabella partizionata per la fase di importazione:

INSERT INTO
 mydataset.orders(
   _PARTITIONTIME,
   id,
   numeric_id)
SELECT
 TIMESTAMP("2023-01-01"),
 id,
 numeric_id,
FROM
 mydataset.ordersof23
WHERE
 numeric_id > 4000000;

best practice

Passaggi successivi