Carica i dati con operazioni cross-cloud

In qualità di amministratore o analista di BigQuery, puoi caricare i dati da un Amazon Simple Storage Service (Amazon S3) o Archiviazione BLOB di Azure in tabelle BigQuery. Tu uni i dati trasferiti con i dati presenti regioni di Google Cloud o sfrutta 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 per il trasferimento tra i cloud utilizzando LOAD. Per i prezzi informazioni, consulta la sezione Omni Cross Cloud Data Transfer in Prezzi di BigQuery Omni.

Ti vengono addebitati i byte per il trasferimento tra i cloud utilizzando CREATE TABLE AS SELECT oppure INSERT INTO SELECT e per la capacità di calcolo.

Entrambe le istruzioni LOAD e CREATE TABLE AS SELECT richiedono slot nel Regioni di BigQuery Omni per la scansione di Amazon S3 e File di archiviazione BLOB per 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 la condividiamo con te. Per informazioni su come creare connessioni, consulta Connettersi ad Amazon S3 o Archiviazione BLOB.

Ruolo richiesto

Per ottenere le autorizzazioni necessarie per caricare i dati tramite trasferimenti cross-cloud, chiedi all'amministratore di concederti Ruolo IAM Editor dati BigQuery (roles/bigquery.dataEditor) nel 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 tramite trasferimenti tra cloud. Per vedere le autorizzazioni esatte obbligatorie, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per caricare i dati tramite trasferimenti cross-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 riuscire a ottenere queste autorizzazioni con ruoli personalizzati e altri ruoli predefiniti.

Per saperne di più sui ruoli IAM in BigQuery, vedi Autorizzazioni e ruoli predefiniti.

Carica dati

Puoi caricare i dati in BigQuery con LOAD DATA [INTO|OVERWRITE].

Limitazioni

  • Caricare dati in una tabella di destinazione con partizione tempo di importazione non è supportato.
  • LOAD DATA job non vengono eseguiti sulle prenotazioni. I job usano on demand di slot 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 se trasferisci dati da un Amazon Simple Storage Service (Amazon S3) o Azure Blob Storage in una regione BigQuery con allocata. Per ulteriori informazioni consulta la sezione Località.
    • Puoi trasferire dati da qualsiasi regione US a più regioni US. Puoi anche trasferire dati da qualsiasi regione EU a più regioni EU.

Esempio

Esempio 1

Nell'esempio seguente viene caricato un file Parquet denominato sample.parquet da un Amazon S3 bucket 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* dal tuo Archiviazione BLOB nella tabella test_csv con la colonna predefinita partizionamento 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 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 60 GiB in byte logici, la query non riesce. La tabella non viene creata e i dati non vengono trasferito. Per scoprire come ridurre le dimensioni dei dati scansionati, vedi Ridurre i dati elaborati nelle query.

  • Le tabelle temporanee non sono supportate.

  • Trasferimento del programma binario noto (WKB) il formato di dati geospaziali non è supportato.

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

  • Nell'istruzione INSERT INTO SELECT, se la tabella di destinazione è uguale alla tabella di origine nella query SELECT, quindi INSERT INTO SELECT non modifica nessuna riga nella tabella di destinazione. Tabella di destinazione non viene modificata perché BigQuery non può leggere i dati tra regioni.

  • CREATE TABLE AS SELECT e INSERT INTO SELECT sono supportati soltanto se trasferire dati da un Amazon S3 o BLOB in una regione BigQuery coallocata. Per ulteriori informazioni consulta la sezione Località.

    • Puoi trasferire dati da qualsiasi regione US a più regioni US. Puoi anche trasferire dati da qualsiasi regione EU a 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 questa tabella a un 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

A questo punto, 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 alla 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;

A questo punto, puoi 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 destinazione utilizzando l'istruzione INSERT INTO SELECT:

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

Esempio 2

L'esempio seguente inserisce i 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 nel campo Data/Ora di importazione tabella partizionata:

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