GoogleSQL per BigQuery supporta le seguenti funzioni di query federate.
Elenco funzioni
Nome | Riepilogo |
---|---|
EXTERNAL_QUERY
|
Esegue una query su un database esterno e restituisce i risultati come tabella temporanea. |
EXTERNAL_QUERY
EXTERNAL_QUERY('connection_id', '''external_database_query'''[, 'options'])
Description
Esegue una query su un database esterno e restituisce i risultati sotto forma di tabella temporanea. Il tipo di dati del database esterno viene convertito in un tipo di dati GoogleSQL nella tabella dei risultati temporanea con queste mappature dei tipi di dati.
external_database_query
: la query da eseguire sul database esterno.connection_id
: l'ID della risorsa di connessione. La risorsa di connessione contiene le impostazioni per la connessione tra il database esterno e BigQuery. Se non hai configurato un progetto predefinito, anteponi l'ID progetto all'ID connessione nel seguente formato:projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID
Sostituisci quanto segue:
- PROJECT_ID: l'ID progetto.
- LOCATION: la località della connessione.
- CONNECTION_ID: l'ID connessione.
Ad esempio,
projects/example-project/locations/us/connections/sql-bq
. Per ulteriori informazioni, consulta Creare una risorsa di connessione.
+ options
: una stringa facoltativa di una mappa in formato JSON con coppie chiave-valore di nome e valore dell'opzione (entrambe sono sensibili alle maiuscole).
For example::
``` '{"default_type_for_decimal_columns":"numeric"}' ```
Supported options:
|Option Name | Description
|-------- | -------
|"default_type_for_decimal_columns" | Can be "float64", "numeric", "bignumeric" or "string". With this option, the MySQL Decimal type or PostgreSQL Numeric type will be mapped to the provided BigQuery type. When this option is not provided, the MySQL Decimal type or PostgreSQL Numeric type will be mapped to BigQuery NUMERIC type.
|"query_execution_priority" | Can be "low", "medium" or "high". Only supported in Spanner. Specifies priority for execution of the query. Execution priority is "medium" by default.
Note aggiuntive
- La funzione
EXTERNAL_QUERY
viene generalmente utilizzata in una clausolaFROM
. - Puoi usare la funzione
EXTERNAL_QUERY()
per accedere ai metadati relativi al database esterno. EXTERNAL_QUERY()
non rispetterà l'ordine del risultato della query esterna, anche se la query esterna includeORDER BY
.
Tipo di dati sui resi
Tabella BigQuery
Esempi
Supponiamo che tu abbia bisogno della data del primo ordine da includere in un report per ciascuno dei tuoi clienti. Questi dati non sono attualmente in BigQuery, ma sono disponibili nel tuo database operativo PostgreSQL in Il seguente esempio di query federata può risolvere questo problema e include tre parti:
- Esegui la query esterna
SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id
nel database operativo PostgreSQL per ottenere la data del primo ordine per ciascun cliente tramite la funzioneEXTERNAL_QUERY()
. - Unisci la tabella del risultato della query esterna alla tabella dei clienti in
BigQuery per
customer_id
. - Seleziona i dati del cliente e la data del primo ordine.
SELECT
c.customer_id, c.name, SUM(t.amount) AS total_revenue, rq.first_order_date
FROM customers AS c
INNER JOIN transaction_fact AS t ON c.customer_id = t.customer_id
LEFT OUTER JOIN
EXTERNAL_QUERY(
'connection_id',
'''SELECT customer_id, MIN(order_date) AS first_order_date
FROM orders
GROUP BY customer_id'''
) AS rq
ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;
Puoi utilizzare la funzione EXTERNAL_QUERY()
per eseguire query sulle tabelle information_schema per accedere ai metadati del database, ad esempio elencare tutte le tabelle nel database o mostrare lo schema della tabella. L'esempio di query information_schema di seguito funziona sia in MySQL che in PostgreSQL.
-- List all tables in a database.
SELECT *
FROM
EXTERNAL_QUERY(
'connection_id',
'''SELECT * FROM information_schema.tables'''
);
-- List all columns in a table.
SELECT *
FROM
EXTERNAL_QUERY(
'connection_id',
'''SELECT * FROM information_schema.columns WHERE table_name='x';'''
);
EXTERNAL_QUERY()
non rispetterà l'ordine del risultato della query esterna, anche se la tua query esterna include ORDER BY
. La query nell'esempio seguente ordina le righe in base all'ID cliente nel database esterno, ma BigQuery non restituirà le righe dei risultati in quell'ordine.
-- ORDER BY will not order rows.
SELECT *
FROM
EXTERNAL_QUERY(
'connection_id',
'''SELECT * FROM customers AS c ORDER BY c.customer_id'''
);
Mappature dei tipi di dati
Quando esegui una query federata, i dati del database esterno vengono convertiti in tipi di GoogleSQL. Di seguito sono riportate le mappature dei tipi di dati da MySQL a BigQuery e PostgreSQL a BigQuery.
Aspetti da considerare sulla mappatura:
- La maggior parte dei tipi di dati MySQL può essere abbinata allo stesso tipo di dati BigQuery, con alcune eccezioni come
decimal
,timestamp
etime
. - PostgreSQL supporta molti tipi di dati non standard che non sono supportati in BigQuery, ad esempio
money
,path
,uuid
,boxer
e altri. - Per impostazione predefinita, i tipi di dati numerici in MySQL e PostgreSQL verranno mappati al valore
NUMERIC
di BigQuery. L'intervallo di valoriNUMERIC
di BigQuery è inferiore a quello di MySQL e PostgreSQL. Può anche essere mappato aBIGNUMERIC
,FLOAT64
oSTRING
con "default_type_for_decimal_columns" nelle opzioniEXTERNAL_QUERY
.
Gestione degli errori
Se la tua query esterna contiene un tipo di dati non supportato in BigQuery, l'operazione non andrà a buon fine immediatamente. Puoi trasmettere il tipo di dati non supportato a un tipo di dati MySQL / PostgreSQL diverso supportato. Per ulteriori informazioni sulla trasmissione, consulta la pagina relativa ai tipi di dati non supportati.
Mappatura dei tipi da MySQL a BigQuery
Tipo MySQL | Descrizione MySQL | Tipo di BigQuery | Differenza di tipo |
---|---|---|---|
Numero intero | |||
INT | 4 byte, 2^32 - 1 | INT64 | |
TINYINT | 1 byte, 2^8 - 1 | INT64 | |
PICCOLO INT | 2 byte, 2^16 - 1 | INT64 | |
MEDIA.INT | 3 byte, 2^24 - 1 | INT64 | |
GRANDE | 8 byte, 2^64 - 1 | INT64 | |
BIGINT NON FIRMATA | 8 byte, 2^64 - 1 | NUMERIC | |
Numero esatto | |||
DECIMALE (M,D) | Un decimale rappresenta (M, D), dove M è il numero totale di cifre e D è il numero di decimali. M <= 65 | NUMERIC, BIGNUMERIC, FLOAT64 o STRING |
DECIMAL (M, D) verrà mappato a NUMERIC per impostazione predefinita oppure può essere mappato a BIGNUMERIC, FLOAT64 o STRING con default_type_for_decimal_columns. |
Numero approssimativo | |||
FLOAT (M,D) | 4 byte, M <= 23 | FLOAT64 | |
DOPPIO (M,D) | 8 byte, M <= 53 | FLOAT64 | |
Data e ora | |||
TIMESTAMP | "1970-01-01 00:00:01" fino a "2038-01-19 03:14:07" UTC. | TIMESTAMP | L'elemento TIMESTAMP di MySQL viene recuperato come fuso orario UTC, indipendentemente dal luogo in cui l'utente chiama BigQuery |
DATETIME | da "1000-01-01 00:00:00" a "9999-12-31 23:59:59" | DATETIME | |
DATA | da "1000-01-01" a "9999-12-31". | DATA | |
TEMPO | Ora nel formato "HH:MM:SS" da "-838:59:59" a "838:59:59". |
ORA |
L'intervallo di tempo di BigQuery è inferiore, da 00:00:00 a 23:59:59 |
ANNO | INT64 | ||
Caratteri e stringhe | |||
ENUM | oggetto stringa con un valore scelto da un elenco di valori consentiti | STRINGA | |
CHAR (M) | Una stringa di lunghezza fissa compresa tra 1 e 255 caratteri | STRINGA | |
VARCHAR (M) | Una stringa a lunghezza variabile compresa tra 1 e 255 caratteri. | STRINGA | |
TESTO | Un campo con una lunghezza massima di 65.535 caratteri. | STRINGA | |
TESTO TINY | Colonna TEXT con una lunghezza massima di 255 caratteri. | STRINGA | |
TESTO MEDIO | Colonna TEXT con una lunghezza massima di 16.777.215 caratteri. | STRINGA | |
TESTO LUNGO | Colonna TEXT con una lunghezza massima di 4294967295 caratteri. | STRINGA | |
Binario | |||
BLOB | Un oggetto binario di grandi dimensioni con una lunghezza massima di 65.535 caratteri. | BYTES | |
MEDIUM_BLOB | Un BLOB con una lunghezza massima di 16777215 caratteri. | BYTES | |
LONG_BLOB | Un BLOB con una lunghezza massima di 4294967295 caratteri. | BYTES | |
TINY_BLOB | Un BLOB con una lunghezza massima di 255 caratteri. | BYTES | |
BINARIO | Una stringa binaria a lunghezza fissa compresa tra 1 e 255 caratteri. | BYTES | |
VARBINARIO | Una stringa binaria a lunghezza variabile compresa tra 1 e 255 caratteri. | BYTES | |
Altro | |||
IMPOSTA | quando dichiari la colonna SET, predefinisci alcuni valori. Quindi, INSERISCI un insieme di valori predefiniti in questa colonna | STRING |
|
GEOMETRIA | GEOGRAPHY | NON ANCORA SUPPORTATO | |
BIT | INT64 | NON ANCORA SUPPORTATO |
Mappatura dei tipi da PostgreSQL a BigQuery
Nome | Description | Tipo di BigQuery | Differenza di tipo |
---|---|---|---|
Numero intero | |||
Smallint | 2 byte, da -32768 a +32767 | INT64 | |
smallserial | Visualizza smallint | INT64 | |
integer | 4 byte, da -2147483648 a +2147483647 | INT64 | |
serial | Visualizza numero intero | INT64 | |
Bigint | 8 byte, da -9223372036854775808 a 9223372036854775807 | INT64 | |
grandeserial | Visualizza bigint | INT64 | |
Numero esatto | |||
numerico [ (p, s) ] | Precisione fino a 1000. | NUMERIC, BIGNUMERIC, FLOAT64 o STRING | numerico [ (p, s) ] verrà mappato a NUMERIC per impostazione predefinita o può essere mappato a BIGNUMERIC, FLOAT64 o STRING con default_type_for_decimal_columns. |
Decimale [ (p, s) ] | Visualizza valori numerici | NUMERIC | Visualizza valori numerici |
denaro | 8 byte, scala a 2 cifre, da -92233720368547758,08 a +92233720368547758,07 | NON SUPPORTATO | |
Numero approssimativo | |||
reale | 4 byte, numero in virgola mobile a precisione singola | FLOAT64 | |
precisione doppia | 8 byte, numero in virgola mobile a precisione doppia | FLOAT64 | |
Data e ora | |||
date | data di calendario (anno, mese, giorno) | DATA | |
ora [ (p) ] [ senza fuso orario ] | ora del giorno (nessun fuso orario) | TEMPO | |
ora [ (p) ] con fuso orario | ora del giorno, incluso il fuso orario | NON SUPPORTATO | |
timestamp [ (p) ] [ senza fuso orario ] | data e ora (nessun fuso orario) | DATETIME | |
timestamp [ (p) ] con fuso orario | data e ora, incluso il fuso orario | TIMESTAMP | L'elemento TIMESTAMP PostgreSQL viene recuperato come fuso orario UTC, indipendentemente dal luogo in cui l'utente chiama BigQuery |
intervallo | Una durata | NON SUPPORTATO | |
Caratteri e stringhe | |||
carattere [ (n) ] | stringa di caratteri a lunghezza fissa | STRINGA | |
carattere variabile [ (n) ] | stringa di caratteri a lunghezza variabile | STRINGA | |
testo | stringa di caratteri a lunghezza variabile | STRINGA | |
Binario | |||
bytea | dati binari ("array di byte") | BYTES | |
bit [ (n) ] | stringa di bit a lunghezza fissa | BYTES | |
bit variabile [ (n) ] | stringa di bit a lunghezza variabile | BYTES | |
Altro | |||
boolean | valore booleano logico (vero/falso) | BOOL | |
Inet | Indirizzo host IPv4 o IPv6 | NON SUPPORTATO | |
percorso | percorso geometrico su un piano | NON SUPPORTATO | |
pg_lsn | Numero di sequenza di log PostgreSQL | NON SUPPORTATO | |
punto | punto geometrico su un piano | NON SUPPORTATO | |
poligono | percorso geometrico chiuso su un piano | NON SUPPORTATO | |
tsquery | query di ricerca testuale | NON SUPPORTATO | |
tsvector | documento di ricerca testuale | NON SUPPORTATO | |
txid_snapshot | istantanea dell'ID transazione a livello di utente | NON SUPPORTATO | |
uuid | identificatore univoco universale | NON SUPPORTATO | |
xml | Dati XML | STRINGA | |
casella | scatola rettangolare su un aereo | NON SUPPORTATO | |
cidr | Indirizzo di rete IPv4 o IPv6 | NON SUPPORTATO | |
cerchio | cerchio su un aereo | NON SUPPORTATO | |
intervallo [ campi ] [ (p) ] | periodo di tempo | NON SUPPORTATO | |
json | dati JSON testuali | STRINGA | |
JSONB | dati JSON binari, scomposti | NON SUPPORTATO | |
linea | linea infinita su un piano | NON SUPPORTATO | |
lseg | segmento su un piano | NON SUPPORTATO | |
Macaddr | Indirizzo MAC (Media Access Control) | NON SUPPORTATO | |
macaddr8 | Indirizzo MAC (Media Access Control) (formato EUI-64) | NON SUPPORTATO |
Tipi di dati MySQL e PostgreSQL non supportati
Se la tua query esterna contiene un tipo di dati non supportato in BigQuery, l'operazione non andrà a buon fine immediatamente. Puoi trasmettere il tipo di dati non supportato a un altro tipo di dati MySQL / PostgreSQL supportato.
- Tipo di dati MySQL non supportato
- Messaggio di errore:
Invalid table-valued function external_query Found unsupported MySQL type in BigQuery. at [1:15]
- Tipo non supportato:
GEOMETRY
,BIT
- Risoluzione: trasmetti il tipo di dati non supportato a STRING.
- Esempio:
SELECT ST_AsText(ST_GeomFromText('POINT(1 1)'));
Questo comando trasmette il tipo di dati non supportatoGEOMETRY
aSTRING
.
- Messaggio di errore:
- Tipo di dati PostgreSQL non supportato
- Messaggio di errore:
Invalid table-valued function external_query Postgres type (OID = 790) is not supported now at [1:15]
- Tipo non supportato:
money, time with time zone, inet, path, pg_lsn, point, polygon, tsquery, tsvector, txid_snapshot, uuid, box, cidr, circle, interval, jsonb, line, lseg, macaddr, macaddr8
- Risoluzione: trasmetti il tipo di dati non supportato a STRING.
- Esempio:
SELECT CAST('12.34'::float8::numeric::money AS varchar(30));
Questo comando trasmette il tipo di dati non supportatomoney
astring
.
- Messaggio di errore:
Mappatura dei tipi da Spanner a BigQuery
Quando esegui una query federata Spanner, i dati di Spanner vengono convertiti in tipi GoogleSQL.
Tipo GoogleSQL Spanner | Tipo di Spanner PostgreSQL | Tipo BigQuery |
---|---|---|
ARRAY |
- | ARRAY |
BOOL |
bool |
BOOL |
BYTES |
bytea |
BYTES |
DATE |
date |
DATE |
FLOAT64 |
float8 |
FLOAT64 |
INT64 |
bigint |
INT64 |
JSON |
JSONB |
JSON |
NUMERIC |
numeric * |
NUMERIC |
STRING |
varchar |
STRING |
STRUCT
|
- | Non supportata per le query federate di Spanner |
TIMESTAMP |
timestamptz |
TIMESTAMP con nanosecondi troncati |
* I valori numerici PostgreSQL con una precisione superiore a quella supportata da BigQuery vengono arrotondati. I valori che superano il valore massimo generano un errore Invalid NUMERIC value
.
Se la tua query esterna contiene un tipo di dati non supportato per le query federate, la query non riesce immediatamente. Puoi trasmettere il tipo di dati non supportato a un tipo di dati supportato.