Mithilfe von DDL-Anweisungen (Data Definition Language, Datendefinitionssprache) können Sie BigQuery-Ressourcen mit der Standard-SQL-Abfragesyntax erstellen und ändern. Derzeit können DDL-Befehle in BigQuery für Folgendes verwendet werden:
- Tabellen, Ansichten und benutzerdefinierte Funktionen (User-Defined Functions, UDFs) erstellen
- Tabellen ändern
- Tabellen und Ansichten löschen
DDL-Anweisungen ausführen
Sie können DDL-Anweisungen mit der Cloud Console, dem bq
-Befehlszeilentool oder der REST API jobs.query
oder programmatisch mithilfe der BigQuery API-Clientbibliotheken ausführen.
Console
Rufen Sie in der Cloud Console die Seite „BigQuery“ auf.
Klicken Sie auf Neue Abfrage erstellen.
Geben Sie die DDL-Anweisung in den Textbereich des Abfrageeditors ein. Beispiel:
CREATE TABLE mydataset.newtable ( x INT64 )
Klicken Sie auf Ausführen.
bq
Geben Sie den Befehl bq query
ein und legen Sie die DDL-Anweisung als Suchparameter fest. Legen Sie das Flag use_legacy_sql
auf false
fest.
bq query --use_legacy_sql=false \ 'CREATE TABLE mydataset.newtable ( x INT64 )'
API
Rufen Sie die Methode jobs.query
auf und geben Sie die DDL-Anweisung im Attribut query
des Anfragetextes an.
Die DDL-Funktionalität erweitert die von einer Jobressource zurückgegebenen Informationen.
statistics.query.statementType
enthält die folgenden zusätzlichen Werte zur DDL-Unterstützung:
CREATE_TABLE
CREATE_TABLE_AS_SELECT
DROP_TABLE
CREATE_VIEW
DROP_VIEW
statistics.query
hat zwei zusätzliche Felder:
ddlOperationPerformed
: Der DDL-Vorgang wurde ausgeführt, möglicherweise abhängig davon, ob das DDL-Ziel vorhanden ist. Zu den aktuellen Werten gehören:CREATE
: Die Abfrage hat das DDL-Ziel erstellt.SKIP
: Managementfrei. Beispiele:CREATE TABLE IF NOT EXISTS
wurde gesendet und die Tabelle ist vorhanden. OderDROP TABLE IF EXISTS
wurde gesendet und die Tabelle ist nicht vorhanden.REPLACE
: Die Abfrage hat das DDL-Ziel ersetzt. Beispiel:CREATE OR REPLACE TABLE
wurde gesendet und die Tabelle ist bereits vorhanden.DROP
: Die Abfrage hat das DDL-Ziel gelöscht.
ddlTargetTable
: Wenn Sie die AnweisungCREATE TABLE/VIEW
oderDROP TABLE/VIEW
senden, wird die Zieltabelle als Objekt mit drei Feldern zurückgegeben:- "projectId": String
- "datasetId": String
- "tableId": String
Java
Rufen Sie die Methode BigQuery.create()
auf, um einen Abfragejob zu starten. Rufen Sie die Methode Job.waitFor()
auf, um auf den Abschluss der DDL-Abfrage zu warten.
Node.js
Python
Rufen Sie die Methode Client.query()
auf, um einen Abfragejob zu starten. Rufen Sie die Methode QueryJob.result()
auf, um auf den Abschluss der DDL-Abfrage zu warten.
CREATE TABLE
-Anweisung
Zum Erstellen einer Tabelle in BigQuery verwenden Sie die DDL-Anweisung CREATE TABLE
.
{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE} [[project_name.]dataset_name.]table_name [( column_name column_schema[, ...] )] [PARTITION BY partition_expression] [CLUSTER BY clustering_column_list] [OPTIONS(table_option_list)] [AS query_statement]
Dabei gilt:
{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE}
ist eine der folgenden Anweisungen:
CREATE TABLE
: Erstellt eine neue Tabelle.CREATE TABLE IF NOT EXISTS
: Erstellt nur dann eine neue Tabelle, wenn die Tabelle im angegebenen Dataset derzeit nicht vorhanden ist.CREATE OR REPLACE TABLE
: Erstellt eine Tabelle und ersetzt dabei eine vorhandene Tabelle mit dem gleichen Namen im angegebenen Dataset.
Für CREATE TABLE
-Anweisungen gelten die folgenden Regeln:
- Es ist nur eine
CREATE
-Anweisung zulässig. - Es muss entweder die Spaltenliste, die
as query_statement
-Klausel oder beides vorhanden sein. - Sind sowohl die Spaltenliste als auch die
as query_statement
-Klausel vorhanden, ignoriert BigQuery die Namen in deras query_statement
-Klausel und gleicht die Spalten mit der Spaltenliste nach Position ab. - Ist nur die
as query_statement
-Klausel und keine Spaltenliste vorhanden, ermittelt BigQuery die Spaltennamen und -typen über dieas query_statement
-Klausel. - Spaltennamen müssen über die Spaltenliste oder über die
as query_statement
-Klausel festgelegt werden. - Identische Spaltennamen sind nicht zulässig.
Tabellenpfad
project_name
ist der Name des Projekts, in dem Sie die Tabelle erstellen.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, in dem Sie die Tabelle erstellen.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
table_name
ist der Name der Tabelle, die Sie erstellen.
Wenn Sie eine Tabelle in BigQuery erstellen, muss der Tabellenname pro Dataset eindeutig sein. Der Tabellenname kann:
- bis zu 1.024 Zeichen enthalten
- Unicode-Zeichen in Kategorie L (Buchstabe), M (Zeichen), N (Zahl), Pc (Verbindungselement, einschließlich Unterstrich), Pd (Strich), Zs (Leerzeichen) enthalten Weitere Informationen finden Sie unter Allgemeine Kategorie.
Beispiele für gültige Tabellennamen sind table-01
, ग्राहक
, 00_お客様
, étudiant
.
Einige Tabellennamen und Präfixe für Tabellennamen sind reserviert. Wenn Ihnen eine Fehlermeldung angezeigt wird, dass der Tabellenname oder das Präfix reserviert ist, wählen Sie einen anderen Namen aus und versuchen Sie es noch einmal.
column_name
und column_schema
(column_name column_schema[, ...])
enthält die Schemainformationen der Tabelle in einer durch Kommas getrennten Liste:
column_name
ist der Name der Spalte. Für einen Spaltennamen gilt:- Er darf nur Buchstaben (a–z, A–Z), Ziffern (0–9) und Unterstriche (_) enthalten.
- Er muss mit einem Buchstaben oder Unterstrich beginnen.
- kann bis zu 128 Zeichen enthalten
column_schema
entspricht einem Datentyp, unterstützt aber eine optionaleNOT NULL
-Einschränkung für andere Typen alsARRAY
.column_schema
unterstützt auch Optionen für Spalten auf der obersten Ebene undSTRUCT
-Felder.
column_schema := {simple_type [NOT NULL] | STRUCT<field_list> [NOT NULL] | ARRAY<array_element_schema>} [OPTIONS(column_option_list)] field_list := field_name column_schema [, ...] array_element_schema := {simple_type | STRUCT<field_list>} [NOT NULL]
simple_type
kann ein beliebiger unterstützter Datentyp außer STRUCT
und ARRAY
sein.
field_name
ist der Name des STRUCT-Felds. Für die Namen von STRUCT-Feldern gelten die gleichen Einschränkungen wie für Spaltennamen.
Wenn für eine Spalte oder ein Feld die Einschränkung NOT NULL
gilt, wird die Spalte bzw. das Feld mit dem Modus REQUIRED
erstellt. Ist hingegen die Einschränkung NOT NULL
nicht vorhanden, wird die Spalte bzw. das Feld mit dem Modus NULLABLE
erstellt.
Spalten und Felder vom Typ ARRAY
unterstützen nicht den Modifikator NOT NULL
. Ein column_schema
vom Typ ARRAY<INT64> NOT NULL
ist beispielsweise ungültig, da ARRAY
-Spalten den Modus REPEATED
haben und leer, aber nicht NULL
sein können. Ein Arrayelement in einer Tabelle kann nicht NULL
sein, unabhängig davon, ob die Einschränkung NOT NULL
angegeben ist. ARRAY<INT64>
entspricht beispielsweise ARRAY<INT64 NOT NULL>
.
Das Attribut NOT NULL
von column_schema
einer Tabelle wird nicht durch Abfragen über die Tabelle weitergegeben. Wenn die Tabelle T
zum Beispiel eine Spalte enthält, die als x INT64 NOT NULL
deklariert ist, erstellt CREATE TABLE dataset.newtable AS SELECT x FROM T
eine Tabelle mit dem Namen dataset.newtable
, in der x
den Wert NULLABLE
hat.
column_schema
kann nur in der Spaltendefinitionsliste von CREATE TABLE
-Anweisungen und nicht als Typ in Ausdrücken verwendet werden. CAST(1 AS INT64 NOT NULL)
ist beispielsweise ungültig.
partition_expression
PARTITION BY
ist eine optionale Klausel, die die Tabellenpartitionierung steuert. partition_expression
ist ein Ausdruck, der festlegt, wie die Tabelle partitioniert wird. Der Partitionsausdruck kann die folgenden Werte enthalten:
PARTITION BY DATE(_PARTITIONTIME)
: Partitioniert die Tabelle anhand des datumsbasierten Zeitstempels in_PARTITIONTIME pseudo column
. Diese Syntax wird nur fürCREATE TABLE
ohne die KlauselAS query_statement
unterstützt.PARTITION BY _PARTITIONDATE
: Partitioniert die Tabelle anhand von_PARTITIONDATE pseudo column
. Diese Syntax wird nur fürCREATE TABLE
ohne die KlauselAS query_statement
unterstützt und entspricht der Verwendung vonPARTITION BY DATE(_PARTITIONTIME)
.PARTITION BY DATE(<timestamp_column>)
: Partitioniert die Tabelle anhand des Datums der SpalteTIMESTAMP
.PARTITION BY RANGE_BUCKET(<integer_column>, GENERATE_ARRAY(start, end[, interval]))
: Partitioniert die Tabelle anhand des angegebenenINTEGER
-Spaltenbereichs.start
ist der Anfang der Bereichspartitionierung (einschließlich),end
ist das Ende der Bereichspartitionierung (ausschließlich) undinterval
die Breite jedes Bereichs innerhalb der Partition. Wenn kein Wert festgelegt ist, wird der Standardwert 1 verwendet.PARTITION BY TIMESTAMP_TRUNC(<timestamp_column>, { DAY | HOUR | MONTH | YEAR })
: Partitioniert die Tabelle anhand von Datum/Stunde/Monat/Jahr der SpalteTIMESTAMP
.PARTITION BY DATETIME_TRUNC(<datetime_column>, { DAY | HOUR | MONTH | YEAR })
: Partitioniert die Tabelle anhand von Datum/Stunde/Monat/Jahr der SpalteDATETIME
.PARTITION BY <date_column>
: Partitioniert die Tabelle anhand der SpalteDATE
.
clustering_column_list
CLUSTER BY
ist eine optionale Klausel, die das Tabellen-Clustering steuert.
clustering_column_list
ist eine durch Kommas getrennte Liste, mit der festgelegt wird, wie die Tabelle geclustert wird. Die Liste der Clustering-Spalten kann eine Liste mit bis zu vier Clustering-Spalten enthalten.
table_option_list
Mit der Optionsliste können Sie Tabellenoptionen wie ein Label oder eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Eine Tabellenoptionsliste muss im folgenden Format angegeben werden:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
partition_expiration_days |
|
Beispiel: Dieses Attribut entspricht dem Attribut timePartitioning.expirationMs der Tabellenressource, verwendet jedoch Tage anstelle von Millisekunden. Ein Tag entspricht 86.400.000 Millisekunden oder 24 Stunden. Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist. |
require_partition_filter |
|
Beispiel: Dieses Attribut entspricht dem Attribut timePartitioning.requirePartitionFilter der Tabellenressource. Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist. |
kms_key_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut encryptionConfiguration.kmsKeyName der Tabellenressource. Weitere Informationen finden Sie unter Daten mit Cloud KMS-Schlüsseln schützen. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
VALUE
ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null
ergibt, wird die entsprechende Option NAME
ignoriert.
Der konstante Ausdruck darf Folgendes nicht enthalten:
- Einen Verweis auf eine Tabelle
- Unterabfragen – SQL-Anweisungen wie
SELECT
,CREATE
undUPDATE
- Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
- Die folgenden Skalarfunktionen:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
column_option_list
Mit column_option_list
in column_schema
können Sie optionale Spalten- oder Feldoptionen angeben. Für Spalten- und Feldoptionen sind Syntax und Anforderungen identisch. Sie unterscheiden sich aber in den Listen für NAME
und VALUE
:
NAME |
VALUE |
Details |
---|---|---|
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut der Tabellenressource schema.fields[].description. |
query_statement
Die Klausel AS query_statement
gibt die Abfrage an, über die die Tabelle erstellt werden soll. Weitere Informationen zur unterstützten Form von query_statement
finden Sie in der Referenz zur SQL-Syntax.
Bekannte Einschränkungen
- Eine nach Aufnahmezeit partitionierte Tabelle kann nicht aus dem Ergebnis einer Abfrage erstellt werden. Erstellen Sie die Tabelle stattdessen mit der DDL-Anweisung
CREATE TABLE
und fügen Sie anschließend die Daten mithilfe der DML-AnweisungINSERT
ein. - Eine Tabelle kann nicht mit dem Modifikator
OR REPLACE
durch eine andere Art der Partitionierung ersetzt werden. Löschen Sie stattdessen die Tabelle mit dem BefehlDROP
und verwenden Sie anschließend die AnweisungCREATE TABLE ... AS SELECT ...
, um sie neu zu erstellen.
Temporäre Tabellen
Zum Erstellen einer temporären Tabelle verwenden Sie das Schlüsselwort TEMP
oder TEMPORARY
, wenn Sie die Anweisung CREATE TABLE
nutzen.
Syntax
{ CREATE {TEMP|TEMPORARY} TABLE | CREATE {TEMP|TEMPORARY} TABLE IF NOT EXISTS | CREATE OR REPLACE {TEMP|TEMPORARY} TABLE } ...
Abgesehen von der Verwendung von TEMP
bzw. TEMPORARY
ist die Syntax identisch mit jener von CREATE TABLE
.
Qualifizieren Sie keine temporären Tabellennamen, d. h., verwenden Sie keinen Projekt- oder Dataset-Qualifier. Temporäre Tabellen werden automatisch in einem speziellen Dataset erstellt.
Für die Dauer des aktuellen Skripts können Sie auf eine temporäre Tabelle anhand des Namens verweisen. Weitere Informationen finden Sie unter Skripterstellung in Standard-SQL. Dazu gehören auch Tabellen, die im Rahmen einer Prozedur innerhalb des Skripts erstellt wurden. Sie können eine Tabelle nicht mehr abfragen, nachdem das Skript, in dem sie erstellt wurde, fertiggestellt ist.
Nachdem ein Skript beendet ist, ist die temporäre Tabelle bis zu 24 Stunden vorhanden. Sie wird nicht mit dem von Ihnen angegebenen Namen gespeichert, ihr wird stattdessen ein zufälliger Name zugewiesen. Um die Tabellenstruktur und die Daten aufzurufen, öffnen Sie die BigQuery-Konsole, klicken Sie auf Abfrageverlauf und wählen die Abfrage aus, mit der die temporäre Tabelle erstellt wurde. Klicken Sie dann in der Zeile Zieltabelle auf Temporäre Tabelle.
Temporäre Tabellen können nicht freigegeben werden. Sie können auch nicht mit der standardmäßigen Auflistungsmethode oder anderen Methoden zur Tabellenbearbeitung sichtbar gemacht werden. Beim Speichern temporärer Tabellen fallen keine Kosten für Sie an.
So erstellen Sie eine temporäre Tabelle:
CREATE TEMP TABLE Example
(
x INT64,
y STRING
);
INSERT INTO Example
VALUES (5, 'foo');
INSERT INTO Example
VALUES (6, 'bar');
SELECT *
FROM Example;
Dieses Skript gibt Folgendes zurück:
+-----+---+-----+
| Row | x | y |
+-----+---|-----+
| 1 | 5 | foo |
| 2 | 6 | bar |
+-----+---|-----+
Sie können eine temporäre Tabelle explizit löschen, bevor das Skript abgeschlossen ist. Dazu müssen Sie eine DROP TABLE
-Anweisung ausführen:
CREATE TEMP TABLE foo(x INT64);
SELECT * FROM foo; -- Succeeds
DROP TABLE foo;
SELECT * FROM foo; -- Results in an error
Wenn temporäre Tabellen zusammen mit einem Standard-Dataset verwendet werden, beziehen sich nicht qualifizierte Tabellennamen auf Folgendes:
- Eine temporäre Tabelle, sofern vorhanden
- Andernfalls eine Tabelle im Standard-Dataset
Eine Ausnahme sind CREATE TABLE
-Anweisungen, bei denen die Zieltabelle nur dann als temporäre Tabelle gilt, wenn das Schlüsselwort TEMP
oder TEMPORARY
vorhanden ist.
Ein Beispiel ist das folgende Skript:
-- Create table t1 in the default dataset
CREATE TABLE t1 (x INT64);
-- Create temporary table t1
CREATE TEMP TABLE t1 (x INT64);
-- This statement will select from the temporary table
SELECT * FROM t1;
-- Drop the temporary table
DROP TABLE t1;
-- Now that the temporary table is dropped, this statement will select from
-- the table in the default dataset
SELECT * FROM t1;
Sie können explizit angeben, dass es sich um eine temporäre Tabelle handelt. Dazu qualifizieren Sie den Tabellennamen mit _SESSION
:
-- Create a temp table CREATE TEMP TABLE t1 (x INT64); -- Create a temp table using the `_SESSION` qualifier CREATE TEMP TABLE _SESSION.t2 (x INT64); -- Select from a temporary table using the `_SESSION` qualifier SELECT * FROM _SESSION.t1;
Wenn Sie den Qualifizierer _SESSION
zum Abfragen einer temporären Tabelle verwenden, die nicht vorhanden ist, wird eine entsprechende Fehlermeldung angezeigt. Wenn z. B. keine temporäre Tabelle namens t3
vorliegt, wird die Fehlermeldung auch dann angezeigt, wenn im Standard-Dataset eine Tabelle namens t3
vorhanden ist.
Sie können _SESSION
nicht zum Erstellen einer nicht temporären Tabelle verwenden:
CREATE TABLE _SESSION.t4 (x INT64); -- Fails
Beispiele
Neue Tabellen erstellen
Im folgenden Beispiel wird in mydataset
eine partitionierte Tabelle mit dem Namen newtable
erstellt.
CREATE TABLE mydataset.newtable ( x INT64 OPTIONS(description="An optional INTEGER field"), y STRUCT< a ARRAY<STRING> OPTIONS(description="A repeated STRING field"), b BOOL > ) PARTITION BY _PARTITIONDATE OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", partition_expiration_days=1, description="a table that expires in 2025, with each partition living for 24 hours", labels=[("org_unit", "development")] )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable`
anstelle von mydataset.newtable
lauten.
Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Already Exists: project_id:dataset.table
Die Tabelle verwendet den folgenden partition_expression
-Ausdruck zum Partitionieren der Tabelle: PARTITION BY _PARTITIONDATE
. Dieser Ausdruck partitioniert die Tabelle anhand des Datums in der Pseudospalte _PARTITIONDATE
.
Das Tabellenschema enthält zwei Spalten:
- x: Ganzzahlspalte mit der Beschreibung "An optional INTEGER field"
y: STRUCT mit zwei Spalten:
- a: Stringarray mit der Beschreibung "A repeated STRING field"
- b: boolescher Wert
Die Tabellenoptionsliste gibt Folgendes an:
- Tabellenablaufzeit: 1. Januar 2025 um 00:00:00 UTC
- Partitionsablaufzeit: 1 Tag
- Beschreibung: Tabelle, die im Jahr 2025 abläuft
- Label: org_unit = development
Neue Tabelle aus einer vorhandenen Tabelle erstellen
Im folgenden Beispiel wird eine Tabelle mit dem Namen top_words
in mydataset
aus einer Abfrage erstellt:
CREATE TABLE mydataset.top_words OPTIONS( description="Top ten words per Shakespeare corpus" ) AS SELECT corpus, ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words FROM bigquery-public-data.samples.shakespeare GROUP BY corpus;
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.top_words`
anstelle von mydataset.top_words
lauten.
Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Already Exists: project_id:dataset.table
Das Tabellenschema enthält zwei Spalten:
- corpus: "Name of a Shakespeare corpus" (Name eines Shakespeare-Korpus)
top_words:
ARRAY
mitSTRUCT
-Werten, das zwei Felder enthält:word
(einSTRING
) undword_count
(einINT64
-Wert mit der Anzahl der Wörter)
Die Tabellenoptionsliste gibt Folgendes an:
- Beschreibung: die häufigsten zehn Wörter pro Shakespeare-Korpus
Tabelle nur erstellen, wenn die Tabelle nicht vorhanden ist
Im folgenden Beispiel wird nur dann in mydataset
eine Tabelle namens newtable
erstellt, wenn in mydataset
keine Tabelle mit dem Namen newtable
vorhanden ist. Ist der Tabellenname im Dataset vorhanden, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>) OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", description="a table that expires in 2025", labels=[("org_unit", "development")] )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable`
anstelle von mydataset.newtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- x: Ganzzahl
y: STRUCT-Wert mit a (Stringarray) und b (boolescher Wert)
Die Tabellenoptionsliste gibt Folgendes an:
- Ablaufzeit – 1. Januar 2025 um 00:00:00 UTC
- Beschreibung: Tabelle, die im Jahr 2025 abläuft
- Label: org_unit = development
Tabellen erstellen oder ersetzen
Im folgenden Beispiel wird in mydataset
eine Tabelle mit dem Namen newtable
erstellt. Wenn newtable
bereits in mydataset
vorhanden ist, wird diese Tabelle mit einer leeren Tabelle überschrieben.
CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>) OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", description="a table that expires in 2025", labels=[("org_unit", "development")] )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable`
anstelle von mydataset.newtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- x: Ganzzahl
y: STRUCT-Wert mit a (Stringarray) und b (boolescher Wert)
Die Tabellenoptionsliste gibt Folgendes an:
- Ablaufzeit – 1. Januar 2025 um 00:00:00 UTC
- Beschreibung: Tabelle, die im Jahr 2025 abläuft
- Label: org_unit = development
Tabellen mit REQUIRED
-Spalten erstellen
Im folgenden Beispiel wird in mydataset
eine Tabelle mit dem Namen newtable
erstellt. Der Modifikator NOT
NULL
in der Spaltendefinitionsliste einer CREATE TABLE
-Anweisung gibt an, dass eine Spalte oder ein Feld im Modus REQUIRED
erstellt wird.
CREATE TABLE my_dataset.new_table ( x INT64 NOT NULL, y STRUCT< a ARRAY<STRING>, b BOOL NOT NULL, c FLOAT64 > NOT NULL, z STRING )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.my_dataset.new_table`
anstelle von my_dataset.new_table
lauten.
Wenn der Tabellenname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Already Exists: project_id:dataset.table
Das Tabellenschema enthält drei Spalten:
- x:
REQUIRED
-Ganzzahl - y:
REQUIRED
-STRUCT-Wert mit a (Stringarray), b (boolescherREQUIRED
-Wert) und c (NULLABLE
-Gleitkommazahl) z:
NULLABLE
-String
Partitionierte Tabelle erstellen
Im folgenden Beispiel wird in mydataset
mithilfe einer DATE
-Spalte eine partitionierte Tabelle mit dem Namen newtable
erstellt.
CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE) PARTITION BY transaction_date OPTIONS( partition_expiration_days=3, description="a table partitioned by transaction_date" )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.newtable`
anstelle von mydataset.newtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- transaction_id: Ganzzahl
- transaction_date: Datum
Die Tabellenoptionsliste gibt Folgendes an:
- Partitionsablauf: drei Tage
- Beschreibung: eine nach
transaction_date
partitionierte Tabelle
Partitionierte Tabelle aus dem Ergebnis einer Abfrage erstellen
Im folgenden Beispiel wird in mydataset
mithilfe einer DATE
-Spalte eine partitionierte Tabelle mit dem Namen days_with_rain
erstellt.
CREATE TABLE mydataset.days_with_rain PARTITION BY date OPTIONS ( partition_expiration_days=365, description="weather stations with precipitation, partitioned by day" ) AS SELECT DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date, (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations WHERE stations.usaf = stn) AS station_name, -- Stations can have multiple names prcp FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather WHERE prcp != 99.9 -- Filter unknown values AND prcp > 0 -- Filter stations/days with no precipitation
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn die project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.days_with_rain`
anstelle von mydataset.days_with_rain
lauten.
Das Tabellenschema enthält zwei Spalten:
- date: Datum (
DATE
) der Datenerfassung - station_name: Name der Wetterstation als
STRING
- prcp: Niederschlagsmenge in Zoll als
FLOAT64
-Gleitkommazahl
Die Tabellenoptionsliste gibt Folgendes an:
- Ablauf der Partition: ein Jahr
- Beschreibung: Wetterstationen mit Niederschlag, nach Tag partitioniert
Geclusterte Tabellen erstellen
Beispiel 1
Im folgenden Beispiel wird in mydataset
eine geclusterte Tabelle namens myclusteredtable
erstellt. Die Tabelle ist eine partitionierte Tabelle, die nach einer Spalte vom Typ TIMESTAMP
partitioniert und nach einer STRING
-Spalte namens customer_id
geclustert wird.
CREATE TABLE mydataset.myclusteredtable ( timestamp TIMESTAMP, customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(timestamp) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable`
anstelle von mydataset.myclusteredtable
lauten.
Das Tabellenschema enthält drei Spalten:
- timestamp: Zeitpunkt der Datenerfassung (Typ
TIMESTAMP
) - customer_id: Kundennummer (Typ
STRING
) - transaction_amount: Anzahl der Transaktionen (Typ
NUMERIC
)
Die Tabellenoptionsliste gibt Folgendes an:
- Ablauf der Partition: 3 Tage
- Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 2
Im folgenden Beispiel wird in mydataset
eine geclusterte Tabelle namens myclusteredtable
erstellt. Die Tabelle ist eine nach Aufnahmezeit partitionierte Tabelle.
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(_PARTITIONTIME) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable`
anstelle von mydataset.myclusteredtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- customer_id: Kundennummer (Typ
STRING
) - transaction_amount: Anzahl der Transaktionen (Typ
NUMERIC
)
Die Tabellenoptionsliste gibt Folgendes an:
- Ablauf der Partition: 3 Tage
- Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 3
Im folgenden Beispiel wird in mydataset
eine geclusterte Tabelle namens myclusteredtable
erstellt. Die Tabelle ist nicht partitioniert.
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id OPTIONS ( description="a table clustered by customer_id" )
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable`
anstelle von mydataset.myclusteredtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- customer_id: Kundennummer (Typ
STRING
) - transaction_amount: Anzahl der Transaktionen (Typ
NUMERIC
)
Die Tabellenoptionsliste gibt Folgendes an:
- Beschreibung: eine nach customer_id geclusterte Tabelle
Geclusterte Tabellen aus dem Ergebnis einer Abfrage erstellen
Beispiel 1
Im folgenden Beispiel wird mithilfe des Ergebnisses einer Abfrage in mydataset
eine geclusterte Tabelle namens myclusteredtable
erstellt. Die Tabelle ist eine partitionierte Tabelle, die nach einer Spalte vom Typ TIMESTAMP
partitioniert ist.
CREATE TABLE mydataset.myclusteredtable ( timestamp TIMESTAMP, customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(timestamp) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" ) AS SELECT * FROM mydataset.myothertable
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable`
anstelle von mydataset.myclusteredtable
lauten.
Das Tabellenschema enthält drei Spalten:
- timestamp: Zeitpunkt der Datenerfassung (Typ
TIMESTAMP
) - customer_id: Kundennummer (Typ
STRING
) - transaction_amount: Anzahl der Transaktionen (Typ
NUMERIC
)
Die Tabellenoptionsliste gibt Folgendes an:
- Ablauf der Partition: 3 Tage
- Beschreibung: eine nach customer_id geclusterte Tabelle
Beispiel 2
Im folgenden Beispiel wird mithilfe des Ergebnisses einer Abfrage in mydataset
eine geclusterte Tabelle namens myclusteredtable
erstellt. Die Tabelle ist nicht partitioniert.
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id OPTIONS ( description="a table clustered by customer_id" ) AS SELECT * FROM mydataset.myothertable
Wenn Sie kein Standardprojekt konfiguriert haben, stellen Sie dem Dataset-Namen in der Beispiel-SQL eine Projekt-ID voran und schließen Sie den Namen in Backticks ein, wenn project_id
Sonderzeichen enthält: `project_id.dataset.table`
. Daher kann der Tabellen-Qualifier `myproject.mydataset.myclusteredtable`
anstelle von mydataset.myclusteredtable
lauten.
Das Tabellenschema enthält zwei Spalten:
- customer_id: Kundennummer (Typ
STRING
) - transaction_amount: Anzahl der Transaktionen (Typ
NUMERIC
)
Die Tabellenoptionsliste gibt Folgendes an:
- Beschreibung: eine nach customer_id geclusterte Tabelle
CREATE VIEW
-Anweisung
Zum Erstellen einer Ansicht in BigQuery verwenden Sie die DDL-Anweisung CREATE VIEW
.
{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW} [[project_name.]dataset_name.]view_name [OPTIONS(view_option_list)] AS query_expression
Dabei gilt:
{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
ist eine der folgenden Anweisungen:
CREATE VIEW
: Erstellt eine neue Ansicht.CREATE VIEW IF NOT EXISTS
: Erstellt nur dann eine neue Ansicht, wenn die Ansicht derzeit im angegebenen Dataset nicht vorhanden ist.CREATE OR REPLACE VIEW
: Erstellt eine Ansicht und ersetzt eine vorhandene Ansicht mit dem gleichen Namen im angegebenen Dataset.
project_name
ist der Name des Projekts, in dem Sie die Ansicht erstellen.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, in dem Sie die Ansicht erstellen.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
view_name
ist der Name der Ansicht, die Sie ändern möchten. Der Ansichtsname muss pro Dataset eindeutig sein. Der Name der Ansicht darf:
- bis zu 1.024 Zeichen enthalten
- Buchstaben (groß-/kleingeschrieben), Zahlen und Unterstriche enthalten.
Mit view_option_list
können Sie zusätzliche Optionen zum Erstellen von Ansichten angeben, beispielsweise ein Label und eine Ablaufzeit.
Für CREATE VIEW
-Anweisungen gelten die folgenden Regeln:
- Es ist nur eine
CREATE
-Anweisung zulässig.
query_expression
ist der Standard-SQL-Abfrageausdruck, der zur Definition der Ansicht verwendet wird.
view_option_list
Mit der Optionsliste können Sie Ansichtsoptionen wie ein Label und eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Die Liste der Ansichtsoptionen müssen Sie im folgenden Format angeben:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
VALUE
ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null
ergibt, wird die entsprechende Option NAME
ignoriert.
Der konstante Ausdruck darf Folgendes nicht enthalten:
- Einen Verweis auf eine Tabelle
- Unterabfragen – SQL-Anweisungen wie
SELECT
,CREATE
undUPDATE
- Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
- Die folgenden Skalarfunktionen:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
Standardprojekt im Ansichtstext
Wenn die Ansicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW
-Anweisung verwendet wird, kann der Ansichtstext query_expression
auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die Ansicht gehört. Betrachten Sie die folgende Beispielabfrage.
CREATE VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;
Nachdem Sie die obige CREATE VIEW
-Abfrage im Projekt myProject
ausgeführt haben, können Sie die Abfrage SELECT * FROM myProject.myDataset.myView
ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT
-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable
immer für das Projekt myProject
aufgelöst.
Wenn die Ansicht nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW
-Anweisung verwendet wird, müssen alle Verweise im Ansichtstext query_expression
mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE VIEW
ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject
ausgeführt wird.
Beispiele
Neue Ansicht erstellen
Im folgenden Beispiel wird in mydataset
eine Ansicht mit dem Namen newview
erstellt.
CREATE VIEW `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Wenn der Ansichtsname im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Already Exists: project_id:dataset.table
Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Liste der Ansichtsoptionen legt Folgendes fest:
- Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
- Anzeigename: newview
- Beschreibung: "A view that expires in 2 days"
- Label: org_unit = development
Ansicht nur erstellen, wenn sie nicht vorhanden ist
Im folgenden Beispiel wird nur dann in mydataset
eine Ansicht mit dem Namen newview
erstellt, wenn in mydataset
keine Ansicht mit dem Namen newview
vorhanden ist. Wenn der Ansichtsname im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Liste der Ansichtsoptionen legt Folgendes fest:
- Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
- Anzeigename: newview
- Beschreibung: "A view that expires in 2 days"
- Label: org_unit = development
Ansicht erstellen oder ersetzen
Im folgenden Beispiel wird in mydataset
eine Ansicht mit dem Namen newview
erstellt. Wenn newview
bereits in mydataset
vorhanden ist, wird diese mit dem angegebenen Abfrageausdruck überschrieben.
CREATE OR REPLACE VIEW `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:
SELECT column_1, column_2, column_3 FROM
myproject.mydataset.mytable
Die Liste der Ansichtsoptionen legt Folgendes fest:
- Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
- Anzeigename: newview
- Beschreibung: "A view that expires in 2 days"
- Label: org_unit = development
CREATE MATERIALIZED VIEW
-Anweisung
Verwenden Sie die DDL-Anweisung CREATE
MATERIALIZED VIEW
, um eine materialisierte Ansicht in BigQuery zu erstellen.
{CREATE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW IF NOT EXISTS } [[project_name.]dataset_name.]materialized_view_name [PARTITION BY partition_expression] [CLUSTER BY clustering_column_list] [OPTIONS(materialized_view_option_list)] AS query_expression
Dabei gilt:
{CREATE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW IF NOT EXISTS }
ist eine der folgenden Anweisungen:
CREATE MATERIALIZED VIEW
: Erstellt eine neue materialisierte Ansicht.CREATE MATERIALIZED VIEW IF NOT EXISTS
: Erstellt eine neue materialisierte Ansicht nur, wenn die materialisierte Ansicht derzeit nicht im angegebenen Dataset vorhanden ist.
project_name
ist der Name des Projekts, in dem Sie die materialisierte Ansicht erstellen.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
Wenn der project_name
weggelassen wird oder mit dem Projekt übereinstimmt, das diese DDL-Abfrage ausführt, wird Letzteres auch als Standardprojekt für die Verweise auf Tabellen, Funktionen usw. in query_expression
verwendet. Beachten Sie, dass das Standardprojekt der Verweise feststeht und nicht von den zukünftigen Abfragen abhängt, die die neue materialisierte Ansicht aufrufen. Andernfalls müssen alle Verweise in query_expression
mit Projekten qualifiziert sein.
dataset_name
ist der Name des Datasets, in dem Sie die materialisierte Ansicht erstellen.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
materialized_view_name
ist der Name der materialisierten Ansicht, die Sie erstellen.
Der Name der materialisierten Ansicht muss pro Dataset eindeutig sein. Der Name der materialisierten Ansicht kann:
- bis zu 1.024 Zeichen enthalten
- Buchstaben (groß-/kleingeschrieben), Zahlen und Unterstriche enthalten.
Die Klauseln PARTITION BY
und CLUSTER BY
werden genau wie in einer CREATE TABLE
-Anweisung verwendet.
Eine materialisierte Ansicht kann nur auf die gleiche Weise wie die Tabelle in query expression
(die Basistabelle) partitioniert werden.
Mit materialized_view_option_list
können Sie zusätzliche Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit.
Für CREATE MATERIALIZED VIEW
-Anweisungen gelten die folgenden Regeln:
- Es ist nur eine
CREATE
-Anweisung zulässig.
query_expression
ist der Standard-SQL-Abfrageausdruck, der zur Definition der materialisierten Ansicht verwendet wird.
materialized_view_option_list
In der Optionsliste können Sie Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Geben Sie eine Optionsliste für die materialisierte Ansicht im folgenden Format an:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
enable_refresh |
BOOLEAN |
Beispiel: |
refresh_interval_minutes |
FLOAT64 |
Beispiel: |
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
Standardprojekt im Text der materialisierten Ansicht
Wenn die materialisierte Ansicht in dem Projekt erstellt wird, das zum Ausführen der CREATE MATERIALIZED VIEW
-Anweisung verwendet wird, kann der Text der materialisierten Ansicht query_expression
auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die materialisierte Ansicht gehört. Betrachten Sie die folgende Beispielabfrage.
CREATE MATERIALIZED VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;
Nachdem Sie die obige CREATE MATERIALIZED VIEW
-Abfrage im Projekt myProject
ausgeführt haben, können Sie die Abfrage SELECT * FROM myProject.myDataset.myView
ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT
-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable
immer für das Projekt myProject
aufgelöst.
Wenn die materialisierte Ansicht nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE VIEW
-Anweisung verwendet wird, müssen alle Verweise im Text der materialisierten Ansicht query_expression
mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE MATERIALIZED VIEW
ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject
ausgeführt wird.
Beispiele
Eine neue materialisierte Ansicht erstellen
Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen new_mv
in mydataset
erstellt.
CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
OPTIONS(
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
friendly_name="new_mv",
description="a materialized view that expires in 2 days",
labels=[("org_unit", "development")],
enable_refresh=true,
refresh_interval_minutes=20
)
AS SELECT column_1, SUM(column_2) AS sum_2, AVG(column_3) AS avg_3
FROM `myproject.mydataset.mytable`
GROUP BY column_1
Wenn der Name der materialisierten Ansicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Already Exists: project_id:dataset.materialized_view
Wenn Sie eine DDL-Anweisung zum Erstellen einer materialisierten Ansicht verwenden, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view`
(einschließlich der Backticks, wenn project_id
Sonderzeichen enthält); zum Beispiel `myproject.mydataset.new_mv`
.
Die materialisierte Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Optionsliste für die materialisierte Ansicht legt Folgendes fest:
- Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die materialisierte Ansicht erstellt wird
- Anzeigename: new_mv
- Beschreibung: Eine materialisierte Ansicht, die in zwei Tagen abläuft
- Label: org_unit = development
- Aktualisierung aktiviert: "true"
- Aktualisierungsintervall: 20 Minuten
Eine materialisierte Ansicht nur erstellen, wenn die materialisierte Ansicht nicht vorhanden ist
Im folgenden Beispiel wird nur dann in mydataset
eine materialisierte Ansicht mit dem Namen new_mv
erstellt, wenn in mydataset
keine materialisierte Ansicht mit dem Namen new_mv
vorliegt. Wenn der Name der materialisierten Ansicht im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
CREATE MATERIALIZED VIEW IF NOT EXISTS `myproject.mydataset.new_mv`
OPTIONS(
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
friendly_name="new_mv",
description="a view that expires in 2 days",
labels=[("org_unit", "development")],
enable_refresh=false
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die materialisierte Ansicht wird mit der folgenden Abfrage in Standard-SQL definiert:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
Die Optionsliste für die materialisierte Ansicht legt Folgendes fest:
- Ablaufzeit: 48 Stunden ab dem Zeitpunkt, an dem die Ansicht erstellt wird
- Anzeigename: new_mv
- Beschreibung: "A view that expires in 2 days"
- Label: org_unit = development
- Aktualisierung aktiviert: "false"
Eine materialisierte Ansicht mit Partitionierung und Clustering erstellen
Im folgenden Beispiel wird eine materialisierte Ansicht namens new_mv
in mydataset
erstellt, die nach der Spalte col_datetime
partitioniert und nach der Spalte col_int
geclustert wird:
CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
PARTITION BY DATE(col_datetime)
CLUSTER BY col_int
AS SELECT col_int, col_datetime, COUNT(1) as cnt
FROM `myproject.mydataset.mv_base_table`
GROUP BY col_int, col_datetime
Die Basistabelle mv_base_table
muss ebenfalls nach der Spalte col_datetime
partitioniert werden. Weitere Informationen finden Sie unter Mit materialisierten Ansichten arbeiten.
CREATE EXTERNAL TABLE
-Anweisung
Mit der CREATE EXTERNAL TABLE
-Anweisung wird eine externe Tabelle erstellt. Über externe Tabellen können in BigQuery Daten abgefragt werden, die außerhalb des BigQuery-Speichers abgelegt sind. Weitere Informationen zu externen Tabellen finden Sie unter Einführung in externe Datenquellen.
CREATE [OR REPLACE] EXTERNAL TABLE [IF NOT EXISTS] [[project_name.]dataset_name.]table_name [( column_name column_schema, ... )] [WITH PARTITION COLUMNS [( partition_column_name partition_column_type, ... )] ] OPTIONS ( external_table_option_list, ... );
Dabei gilt:
project_name
ist der Name des Projekts, in dem Sie die Tabelle erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.dataset_name
ist der Name des Datasets, in dem Sie die Tabelle erstellen.table_name
ist der Name der externen Tabelle.column_name
ist der Name einer Spalte in der Tabelle.Mit
column_schema
wird das Schema der Spalte angegeben. Dabei wird dieselbe Syntax wie die Definitioncolumn_schema
in derCREATE TABLE
-Anweisung verwendet. Wenn Sie diese Klausel nicht einbeziehen, erkennt BigQuery das Schema automatisch.partition_column_name
ist der Name einer Partitionsspalte. Geben Sie dieses Feld an, wenn Ihre externen Daten ein mit Hive partitioniertes Layout verwenden. Weitere Informationen finden Sie unter Unterstützte Datenlayouts.partition_column_type
ist der Typ der Partitionsspalte.external_table_option_list
gibt eine Liste von Optionen zum Erstellen der externen Tabelle an.
external_table_option_list
Mit der Optionsliste legen Sie Optionen zum Erstellen der externen Tabelle fest. Die Optionen format
und uris
sind erforderlich. Geben Sie die Optionsliste im folgenden Format an: NAME=VALUE, ...
.
Optionen | |
---|---|
allow_jagged_rows |
Bei Gilt für CSV-Daten. |
allow_quoted_newlines |
Bei Gilt für CSV-Daten. |
compression |
Komprimierungstyp der Datenquelle. Diese Werte werden unterstützt:
Gilt für CSV- und JSON-Daten. |
description |
Eine Beschreibung dieser Tabelle. |
enable_logical_types |
Bei Gilt für Avro-Daten. |
encoding |
Die Zeichencodierung der Daten. Unterstützte Werte sind:
Gilt für CSV-Daten. |
expiration_timestamp |
Die Zeit, zu der diese Tabelle abläuft. Wenn keine Angabe erfolgt, läuft die Tabelle nicht ab. Beispiel: |
field_delimiter |
Das Trennzeichen für Felder in einer CSV-Datei. Gilt für CSV-Daten. |
format |
Das Format der externen Daten.
Unterstützte Werte sind:
Der Wert |
decimal_target_types |
Bestimmt, wie ein Beispiel: |
hive_partition_uri_prefix |
Ein gemeinsames Präfix für alle Quell-URIs, bevor die Codierung des Partitionierungsschlüssels beginnt. Gilt nur für mit Hive partitionierte Tabellen. Gilt für Avro-, CSV-, JSON-, Parquet- und ORC-Daten. Beispiel: |
ignore_unknown_values |
Bei Gilt für CSV- und JSON-Daten. |
max_bad_records |
Die maximale Anzahl fehlerhafter Datensätze, die beim Lesen der Daten ignoriert werden. Gilt für CSV-, JSON- und Google Tabellen-Daten. |
null_marker |
Der String, der Gilt für CSV-Daten. |
projection_fields |
Eine Liste der zu ladenden Entitätsattribute. Gilt für Datastore-Daten. |
quote |
Der String, der zum Kennzeichnen von Datenabschnitten in einer CSV-Datei verwendet wird. Wenn Ihre Daten Zeilenumbruchzeichen in Anführungszeichen enthalten, setzen Sie auch das Attribut Gilt für CSV-Daten. |
require_hive_partition_filter |
Bei Gilt für Avro-, CSV-, JSON-, Parquet- und ORC-Daten. |
sheet_range |
Bereich einer Google Tabellen-Tabelle, aus der abgefragt werden soll. Gilt für Google Tabellen-Daten. Beispiel: |
skip_leading_rows |
Die Anzahl der Zeilen am Anfang einer Datei, die beim Lesen der Daten übersprungen werden sollen. Gilt für CSV- und Google Tabellen-Daten. |
uris |
Ein Array von voll qualifizierten URIs für die externen Datenspeicherorte. Beispiel: |
Die CREATE EXTERNAL TABLE
-Anweisung unterstützt nicht das Erstellen temporärer externer Tabellen.
Zum Erstellen einer extern partitionierten Tabelle verwenden Sie die Klausel WITH PARTITION COLUMNS
, um die Details des Partitionsschemas anzugeben. BigQuery prüft die Spaltendefinitionen anhand des externen Speicherorts. Die Schemadeklaration muss die Reihenfolge der Felder im externen Pfad genau einhalten. Weitere Informationen zur externen Partitionierung finden Sie unter Extern partitionierte Daten abfragen.
Beispiele
Im folgenden Beispiel wird eine externe Tabelle aus mehreren URIs erstellt. Das Datenformat ist CSV. In diesem Beispiel wird die automatische Schemaerkennung verwendet.
CREATE EXTERNAL TABLE dataset.CsvTable OPTIONS (
format = 'CSV',
uris = ['gs://bucket/path1.csv', 'gs://bucket/path2.csv']
);
Im folgenden Beispiel wird eine externe Tabelle aus einer CSV-Datei erstellt und das Schema explizit angegeben. Außerdem wird das Feldtrennzeichen ('|'
) angegeben und die Anzahl der maximal zulässigen fehlerhaften Datensätzen festgelegt.
CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
x INT64,
y STRING
)
OPTIONS (
format = 'CSV',
uris = ['gs://bucket/path1.csv'],
field_delimiter = '|',
max_bad_records = 5
);
Im folgenden Beispiel wird eine extern partitionierte Tabelle erstellt. Mit der automatischen Schemaerkennung wird sowohl das Dateisystem als auch das Hive-Partitionierungslayout ermittelt.
Wenn der externe Pfad beispielsweise gs://bucket/path/field_1=first/field_2=1/data.csv
ist, lauten die Partitionsspalten field_1
(STRING
) und field_2
(INT64
).
CREATE EXTERNAL TABLE dataset.AutoHivePartitionedTable
WITH PARTITION COLUMNS
OPTIONS (
uris=['gs://bucket/path/*'],
format=csv,
hive_partition_uri_prefix='gs://bucket/path'
);
Im folgenden Beispiel wird eine extern partitionierte Tabelle erstellt, indem die Partitionsspalten explizit angegeben werden. In diesem Beispiel wird davon ausgegangen, dass der externe Dateipfad das Muster gs://bucket/path/field_1=first/field_2=1/data.csv
hat.
CREATE EXTERNAL TABLE dataset.CustomHivePartitionedTable
WITH PARTITION COLUMNS (
field_1 STRING, -- column order must match the external path
field_2 INT64
)
OPTIONS (
uris=['gs://bucket/path/*'],
format=csv,
hive_partition_uri_prefix='gs://bucket/path'
);
CREATE FUNCTION
-Anweisung
BigQuery unterstützt benutzerdefinierte Funktionen (UDFs). Mithilfe einer UDF können Sie unter Verwendung eines SQL-Ausdrucks oder mit JavaScript Funktionen erstellen. Diese Funktionen akzeptieren Spalten als Eingabe und führen Aktionen durch. Das Ergebnis dieser Aktionen wird als Wert zurückgegeben.
UDFs können entweder persistent oder temporär sein. Sie können persistente UDFs für mehrere Abfragen verwenden, temporäre UDFs jedoch nur in einer einzigen Abfrage. Weitere Informationen zu nutzerdefinierten Funktionen finden Sie unter nutzerdefinierte Funktionen.
UDF-Syntax
Verwenden Sie die folgende Syntax, um eine persistente UDF zu erstellen:
CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] [[project_name.]dataset_name.]function_name ([named_parameter[, ...]]) [RETURNS data_type] { sql_function_definition | javascript_function_definition }
Verwenden Sie die folgende Syntax, um eine temporäre UDF zu erstellen:
CREATE [OR REPLACE] {TEMPORARY | TEMP} FUNCTION [IF NOT EXISTS] function_name ([named_parameter[, ...]]) [RETURNS data_type] { sql_function_definition | javascript_function_definition }
named_parameter: param_name param_type sql_function_definition: AS (sql_expression) javascript_function_definition: [determinism_specifier] LANGUAGE js [OPTIONS (library = library_array)] AS javascript_code determinism_specifier: { DETERMINISTIC | NOT DETERMINISTIC }
Diese Syntax besteht aus den folgenden Komponenten:
CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }: Erstellt oder aktualisiert eine Funktion. Zum Ersetzen einer vorhandenen gleichnamigen Funktion verwenden Sie das Schlüsselwort
OR REPLACE
. Wenn eine Abfrage als erfolgreich behandelt werden, aber keine Aktion auslösen soll, falls bereits eine gleichnamige Funktion vorhanden ist, verwenden Sie die KlauselIF NOT EXISTS
.project_name ist der Name des Projekts, in dem Sie die Funktion erstellen. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (
`
) gesetzt werden (Beispiel:`google.com:my_project`
).dataset_name ist der Name des Datasets, in dem Sie die Funktion erstellen. Die Standardeinstellung ist
defaultDataset
in der Anfrage.named_parameter: Besteht aus durch Kommas getrennten Paaren aus
param_name
undparam_type
. Der Wert vonparam_type
ist ein BigQuery-Datentyp. Bei einer SQL-UDF kann der Wert vonparam_type
auchANY TYPE
sein.determinism_specifier. Gilt nur für benutzerdefinierte JavaScript-Funktionen. Weist BigQuery darauf hin, ob das Abfrageergebnis im Cache speicherbar ist. Kann einer der folgenden Werte sein:
DETERMINISTIC
: Die Funktion gibt immer dasselbe Ergebnis zurück, wenn dieselben Argumente übergeben werden. Das Abfrageergebnis sind potenziell im Cache speicherbar. Wenn die Funktionadd_one(i)
beispielsweise immeri + 1
zurückgibt, ist die Funktion deterministisch.NOT DETERMINISTIC
: Die Funktion gibt nicht immer dasselbe Ergebnis zurück, wenn dieselben Argumente übergeben werden, und ist daher nicht im Cache speicherbar. Wennadd_random(i)
zum Beispieli + rand()
zurückgibt, ist die Funktion nicht deterministisch und BigQuery verwendet keine im Cache gespeicherten Ergebnisse.Wenn alle aufgerufenen Funktionen DETERMINISTISCH sind, versucht BigQuery, das Ergebnis im Cache zu speichern, außer die Ergebnisse sind aus anderen Gründen nicht im Cache speicherbar. Weitere Informationen finden Sie unter Im Cache gespeicherte Abfrageergebnisse verwenden.
[RETURNS data_type]: Gibt den Datentyp an, der von der Funktion zurückgegeben wird.
- Wenn die Funktion in SQL definiert ist, ist die Klausel
RETURNS
optional. Wenn die KlauselRETURNS
nicht angegeben wird und die Funktion von einer Abfrage aufgerufen wird, leitet BigQuery den Ergebnistyp der Funktion aus dem SQL-Funktionsrumpf ab. - Wenn die Funktion in JavaScript definiert ist, muss die Klausel
RETURNS
verwendet werden. Weitere Informationen zu zulässigen Werten fürdata_type
finden Sie unter Von JavaScript-UDFs unterstützte Datentypen.
- Wenn die Funktion in SQL definiert ist, ist die Klausel
AS (sql_expression). Gibt den SQL-Ausdruck an, der die Funktion definiert.
[OPTIONS (library = library_array)]: Definiert für eine JavaScript-UDF ein Array von JavaScript-Bibliotheken, die in die Funktionsdefinition aufgenommen werden sollen.
AS javascript_code. Gibt die Definition einer JavaScript-Funktion an.
javascript_code
ist ein Stringliteral.
SQL-UDF-Struktur
Erstellen Sie SQL-UDFs mit der folgenden Syntax:
CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS] [[`project_name`.]dataset_name.]function_name ([named_parameter[, ...]]) [RETURNS data_type] AS (sql_expression) named_parameter: param_name param_type
Vorlagen für SQL-UDF-Parameter
Ein Vorlagenparameter mit param_type
= ANY TYPE
kann bei einem Funktionsaufruf mit mehr als einem Argumenttyp übereinstimmen.
- Wenn mehrere Parameter den Typ
ANY TYPE
haben, erzwingt BigQuery keine Typbeziehung zwischen diesen Argumenten. - Der Rückgabetyp der Funktion darf nicht
ANY TYPE
sein. Er muss entweder ausgelassen werden, d. h. automatisch anhand vonsql_expression
ermittelt werden, oder ein expliziter Typ sein. - Werden der Funktion Argumente mit Typen übergeben, die nicht mit der Funktionsdefinition kompatibel sind, wird zum Aufrufzeitpunkt ein Fehler ausgelöst.
Standardprojekt im SQL-UDF-Text
Wenn die SQL-UDF in demselben Projekt erstellt wird, in dem die CREATE FUNCTION
-Anweisung ausgeführt wird, kann der UDF-Text sql_expression
auf Entitäten verweisen, ohne das Projekt anzugeben. Das Standardprojekt ist das Projekt, zu dem die UDF gehört. Betrachten Sie die folgende Beispielabfrage.
CREATE FUNCTION myProject.myDataset.myFunction() AS (anotherDataset.anotherFunction());
Nachdem Sie die obige CREATE FUNCTION
-Abfrage im Projekt myProject
ausgeführt haben, können Sie die Abfrage SELECT myProject.myDataset.myFunction()
ausführen. Unabhängig davon, in welchem Projekt Sie diese SELECT
-Abfrage ausführen, wird die referenzierte Funktion anotherDataset.anotherFunction
immer für das Projekt myProject
aufgelöst.
Wenn die UDF nicht in dem Projekt erstellt wird, das zum Ausführen der CREATE FUNCTION
-Anweisung verwendet wird, müssen alle Verweise im UDF-Text sql_expression
mit Projekt-IDs qualifiziert sein. Die vorherige Beispielabfrage CREATE FUNCTION
ist beispielsweise ungültig, wenn sie in einem anderen Projekt als myProject
ausgeführt wird.
SQL-UDF-Beispiele
Im folgenden Beispiel wird eine persistente SQL-UDF erstellt. Es wird dabei davon ausgegangen, dass im aktiven Projekt ein Dataset mit dem Namen mydataset
vorhanden ist. Wenn kein Dataset mit diesem Namen vorhanden ist, finden Sie entsprechende Informationen in der Dokumentation zum Erstellen von Datasets.
CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
AS (x * y);
Nachdem Sie die Anweisung CREATE FUNCTION
ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden. Ersetzen Sie den Abfrageeditor durch den folgenden Inhalt und führen Sie die Abfrage aus:
WITH numbers AS
(SELECT 1 AS x, 5 as y
UNION ALL
SELECT 2 AS x, 10 as y
UNION ALL
SELECT 3 as x, 15 as y)
SELECT x, y, mydataset.multiplyInputs(x, y) as product
FROM numbers;
Das vorstehende Beispiel erzeugt folgende Ausgabe:
+-----+-----+--------------+
| x | y | product |
+-----+-----+--------------+
| 1 | 5 | 5 |
| 2 | 10 | 20 |
| 3 | 15 | 45 |
+-----+-----+--------------+
Das folgende Beispiel zeigt eine persistente SQL-UDF, die einen Vorlagenparameter verwendet. Die daraus resultierende Funktion akzeptiert Argumente verschiedener Typen.
CREATE FUNCTION mydataset.addFourAndDivideAny(x ANY TYPE, y ANY TYPE) AS (
(x + 4) / y
);
Nachdem Sie die Anweisung CREATE FUNCTION
ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:
SELECT addFourAndDivideAny(3, 4) AS integer_output,
addFourAndDivideAny(1.59, 3.14) AS floating_point_output;
Diese Abfrage gibt die folgende Ausgabe zurück:
+----------------+-----------------------+
| integer_output | floating_point_output |
+----------------+-----------------------+
| 1.75 | 1.7802547770700636 |
+----------------+-----------------------+
Das folgende Beispiel zeigt eine SQL-UDF, die über einen Vorlagenparameter das letzte Element eines Arrays eines beliebigen Typs zurückgibt.
CREATE FUNCTION mydataset.lastArrayElement(arr ANY TYPE) AS (
arr[ORDINAL(ARRAY_LENGTH(arr))]
);
Nachdem Sie die Anweisung CREATE FUNCTION
ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:
SELECT
names[OFFSET(0)] AS first_name,
lastArrayElement(names) AS last_name
FROM (
SELECT ['Fred', 'McFeely', 'Rogers'] AS names UNION ALL
SELECT ['Marie', 'Skłodowska', 'Curie']
);
Die obige Abfrage gibt die folgende Ausgabe zurück:
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Fred | Rogers |
| Marie | Curie |
+------------+-----------+
Struktur einer JavaScript-UDF
Persistente JavaScript-UDFs werden mit der folgenden Syntax erstellt.
CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS] [[`project_name`.]dataset_name.]function_name ([named_parameter[, ...]]) RETURNS data_type [DETERMINISTIC | NOT DETERMINISTIC] LANGUAGE js [OPTIONS (library = library_array)] AS javascript_code
Weitere Informationen zu zulässigen Werten für data_type
und Paramtertypen finden Sie unter Unterstützte UDF-Datentypen in JavaScript.
Beispiele für JavaScript-UDFs
CREATE TEMP FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
return x*y;
""";
Nachdem Sie die Anweisung CREATE FUNCTION
ausgeführt haben, können Sie die neue persistente JavaScript-UDF in einer separaten Abfrage verwenden:
WITH numbers AS
(SELECT 1 AS x, 5 as y
UNION ALL
SELECT 2 AS x, 10 as y
UNION ALL
SELECT 3 as x, 15 as y)
SELECT x, y, multiplyInputs(x, y) as product
FROM numbers;
Das obige Beispiel generiert folgende Ausgabe:
+-----+-----+--------------+
| x | y | product |
+-----+-----+--------------+
| 1 | 5 | 5 |
| 2 | 10 | 20 |
| 3 | 15 | 45 |
+-----+-----+--------------+
Sie können das Ergebnis einer UDF als Eingabe an eine andere UDF übergeben. Erstellen Sie beispielsweise eine persistente UDF mit der folgenden Abfrage:
CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
return x*y;
""";
Führen Sie dann eine andere Abfrage aus, um eine weitere persistente UDF zu erstellen:
CREATE FUNCTION mydataset.divideByTwo(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
return x/2;
""";
Führen Sie nun die folgende Abfrage aus, um beide persistenten UDFs in derselben Abfrage zu verwenden:
WITH numbers AS
(SELECT 1 AS x, 5 as y
UNION ALL
SELECT 2 AS x, 10 as y
UNION ALL
SELECT 3 as x, 15 as y)
SELECT x,
y,
mydataset.multiplyInputs(
mydataset.divideByTwo(x), mydataset.divideByTwo(y)) as half_product
FROM numbers;
Das obige Beispiel generiert folgende Ausgabe:
+-----+-----+--------------+
| x | y | half_product |
+-----+-----+--------------+
| 1 | 5 | 1.25 |
| 2 | 10 | 5 |
| 3 | 15 | 11.25 |
+-----+-----+--------------+
Im folgenden Beispiel werden die Werte aller Felder namens "foo" im angegebenen JSON-String summiert.
CREATE FUNCTION mydataset.SumFieldsNamedFoo(json_row STRING)
RETURNS FLOAT64
LANGUAGE js
AS """
function SumFoo(obj) {
var sum = 0;
for (var field in obj) {
if (obj.hasOwnProperty(field) && obj[field] != null) {
if (typeof obj[field] == "object") {
sum += SumFoo(obj[field]);
} else if (field == "foo") {
sum += obj[field];
}
}
}
return sum;
}
var row = JSON.parse(json_row);
return SumFoo(row);
""";
Nachdem Sie die Anweisung CREATE FUNCTION
ausgeführt haben, können Sie die neue persistente benutzerdefinierte Funktion in einer separaten Abfrage verwenden:
WITH Input AS (
SELECT STRUCT(1 AS foo, 2 AS bar, STRUCT('foo' AS x, 3.14 AS foo) AS baz) AS s, 10 AS foo UNION ALL
SELECT NULL, 4 AS foo UNION ALL
SELECT STRUCT(NULL, 2 AS bar, STRUCT('fizz' AS x, 1.59 AS foo) AS baz) AS s, NULL AS foo
)
SELECT
TO_JSON_STRING(t) AS json_row,
mydataset.SumFieldsNamedFoo(TO_JSON_STRING(t)) AS foo_sum
FROM Input AS t;
Das obige Beispiel generiert folgende Ausgabe:
+---------------------------------------------------------------------+---------+
| json_row | foo_sum |
+---------------------------------------------------------------------+---------+
| {"s":{"foo":1,"bar":2,"baz":{"x":"foo","foo":3.14}},"foo":10} | 14.14 |
| {"s":null,"foo":4} | 4 |
| {"s":{"foo":null,"bar":2,"baz":{"x":"fizz","foo":1.59}},"foo":null} | 1.59 |
+---------------------------------------------------------------------+---------+
Regeln für Anführungszeichen
Der JavaScript-Code muss in Anführungszeichen gesetzt werden. Für einfache, einzeilige Code-Snippets können Sie einen Standardstring in Anführungszeichen verwenden:
CREATE FUNCTION mydataset.plusOne(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS "return x+1;";
In Fällen, in denen das Snippet Anführungszeichen enthält oder aus mehreren Zeilen besteht, verwenden Sie Blocks mit dreifachen Anführungszeichen:
CREATE FUNCTION mydataset.customGreeting(a STRING)
RETURNS STRING
LANGUAGE js AS """
var d = new Date();
if (d.getHours() < 12) {
return 'Good Morning, ' + a + '!';
} else {
return 'Good Evening, ' + a + '!';
}
""";
JavaScript-Bibliotheken einbeziehen
Sie können JavaScript-UDFs über den Bereich OPTIONS
erweitern. In diesem Abschnitt können Sie JavaScript-Codebibliotheken für die UDF angeben.
CREATE FUNCTION mydataset.myFunc(a FLOAT64, b STRING)
RETURNS STRING
LANGUAGE js
OPTIONS (
library=["gs://my-bucket/path/to/lib1.js", "gs://my-bucket/path/to/lib2.js"]
)
AS
"""
// Assumes 'doInterestingStuff' is defined in one of the library files.
return doInterestingStuff(a, b);
""";
SELECT mydataset.myFunc(3.14, 'foo');
Im vorherigen Beispiel ist der Code in lib1.js
und lib2.js
für jeden Code im Bereich javascript_code
der UDF verfügbar. Sie können Bibliotheksdateien entweder mithilfe eines einzelnen Elements oder mit einer Arraysyntax angeben.
UDFs und die Cloud Console
Sie können die Cloud Console verwenden, um persistente benutzerdefinierte Funktionen zu erstellen.
Abfragen zum Erstellen persistenter UDFs ausführen
Rufen Sie in der Cloud Console die Seite „BigQuery“ auf.
Klicken Sie auf Neue Abfrage erstellen.
Geben Sie die UDF-Anweisung in den Textbereich des Abfrageeditors ein. Beispiel:
CREATE FUNCTION mydataset.timesTwo(x FLOAT64) RETURNS FLOAT64 LANGUAGE js AS """ return x*2; """;
Klicken Sie auf Ausführen.
Ersetzen Sie nach dem Erstellen der persistenten UDF den Editorinhalt durch eine neue Abfrage, in der diese verwendet wird:
SELECT mydataset.timesTwo(numbers) AS doubles FROM UNNEST([1, 2, 3, 4, 5]) AS numbers;
Klicken Sie auf Ausführen.
UDFs und das bq-Befehlszeilentool
Sie können über das bq-Befehlszeilentool im Cloud SDK persistente UDFs erstellen.
Verwenden Sie die folgende Syntax, um eine Abfrage zum Erstellen einer persistenten UDF auszuführen:
bq query --use_legacy_sql=false '
CREATE FUNCTION mydataset.AddTwo(x INT64) AS (x + 2);
'
CREATE PROCEDURE
-Anweisung
Erstellt eine Prozedur als einen Block von Anweisungen, die von anderen Abfragen aufgerufen werden können.
CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS] [[project_name.]dataset_name.]procedure_name (procedure_argument[, ...] ) [OPTIONS(procedure_option_list)] BEGIN statement_list END; procedure_argument: [procedure_argument_mode] argument_name argument_type
procedure_argument_mode: IN | OUT | INOUT
Beschreibung
project_name
ist der Name des Projekts, in dem Sie das Verfahren erstellen.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, in dem Sie das Verfahren erstellen.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
statement_list
ist eine BigQuery-Anweisungsliste. Eine Anweisungsliste besteht aus einer Reihe von Anweisungen, die jeweils mit einem Semikolon abgeschlossen werden.
argument_type
ist ein beliebiger gültiger BigQuery-Typ.
procedure_argument_mode
gibt an, ob ein Argument eine Eingabe, eine Ausgabe oder beides ist.
Prozeduren können rekursiv sich selbst aufrufen.
procedure_option_list
Mit procedure_option_list
können Sie Verfahrensoptionen angeben. Für Prozeduroptionen sind Syntax und Anforderungen identisch. Sie unterscheiden sich aber in den Listen für NAME
und VALUE
:
NAME |
VALUE |
Details |
---|---|---|
strict_mode |
|
Beispiel: Wenn Obwohl Wenn Der Standardwert ist |
Argumentmodus
IN
gibt an, dass das Argument nur eine Eingabe für die Prozedur ist. Sie können für IN
-Argumente entweder eine Variable oder einen Wertausdruck angeben.
OUT
gibt an, dass das Argument eine Ausgabe der Prozedur ist. Ein OUT
-Argument wird beim Start der Prozedur mit NULL
initialisiert. Für OUT
-Argumente müssen Sie eine Variable angeben.
INOUT
gibt an, dass das Argument sowohl eine Eingabe für die Prozedur als auch eine Ausgabe der Prozedur ist. Auch für INOUT
-Argumente müssen Sie eine Variable festlegen. Auf ein INOUT
-Argument kann im Verfahrenstext in Form einer Variable und in Form von zugewiesenen neuen Werten verwiesen werden.
Wenn weder IN
, OUT
noch INOUT
angegeben ist, wird das Argument als IN
-Argument behandelt.
Bereich von Variablen
Wenn eine Variable außerhalb einer Prozedur deklariert sowie als INOUT- oder OUT-Argument an eine Prozedur übergeben wird und die Prozedur der Variablen einen neuen Wert zuweist, ist dieser außerhalb der Prozedur sichtbar.
In einer Prozedur deklarierte Variablen sind außerhalb der Prozedur nicht sichtbar und umgekehrt.
Mithilfe von SET
kann einem OUT
- oder INOUT
-Argument aber ein Wert zugewiesen werden. Der geänderte Wert ist dann außerhalb des Verfahrens sichtbar. Wenn die Prozedur erfolgreich beendet wird, ist der Wert des OUT
- bzw. INOUT
-Arguments dann der endgültige Wert, der dieser INOUT
-Variable zugewiesen wird.
Temporäre Tabellen sind immer für die Dauer des Skripts vorhanden. Wenn eine Prozedur eine temporäre Tabelle erstellt, kann der Aufrufer der Prozedur auch auf die temporäre Tabelle verweisen.
Standardprojekt im Verfahrenstext
In den Verfahrenstexten können Entitäten ohne Angabe des Projekts referenziert werden. Das Standardprojekt ist das Projekt, zu dem das Verfahren gehört, und nicht unbedingt das Projekt, mit dem die Anweisung CREATE PROCEDURE
ausgeführt wird. Betrachten Sie die folgende Beispielabfrage.
CREATE PROCEDURE myProject.myDataset.QueryTable()
BEGIN
SELECT * FROM anotherDataset.myTable;
END;
Nachdem Sie das obige Verfahren erstellt haben, können Sie die Abfrage CALL myProject.myDataset.QueryTable()
ausführen. Unabhängig davon, in welchem Projekt Sie diese CALL
-Abfrage ausführen, wird die referenzierte Tabelle anotherDataset.myTable
immer für das Projekt myProject
aufgelöst.
Beispiele
Im folgenden Beispiel wird eine Prozedur erstellt, die x
sowohl als Eingabeargument verwendet als auch x
als Ausgabe zurückgibt. Da für das Argument delta
kein Argumentmodus festgelegt ist, gilt es als Eingabeargument. Die Prozedur besteht aus einem Block mit einer einzigen Anweisung, durch die die Summe der beiden Eingabeargumente zu x
zugewiesen wird.
CREATE PROCEDURE mydataset.AddDelta(INOUT x INT64, delta INT64)
BEGIN
SET x = x + delta;
END;
Im folgenden Beispiel wird die AddDelta
-Prozedur aus dem obigen Beispiel aufgerufen, wobei beide Male die Variable accumulator
an sie übergeben wird. Da die Änderungen an x
innerhalb von AddDelta
außerhalb von AddDelta
sichtbar sind, erhöhen diese Prozeduraufrufe accumulator
um insgesamt 8.
DECLARE accumulator INT64 DEFAULT 0;
CALL mydataset.AddDelta(accumulator, 5);
CALL mydataset.AddDelta(accumulator, 3);
SELECT accumulator;
Es wird Folgendes zurückgegeben:
+-------------+
| accumulator |
+-------------+
| 8 |
+-------------+
Im folgenden Beispiel wird die Prozedur SelectFromTablesAndAppend
erstellt, die target_date
als Eingabeargument verwendet und rows_added
als Ausgabe zurückgibt.
Mit der Prozedur wird aus einer Abfrage eine temporäre Tabelle DataForTargetDate
erstellt. Anschließend wird die Anzahl der Zeilen in DataForTargetDate
berechnet und das Ergebnis rows_added
zugewiesen. Als Nächstes wird eine neue Zeile in TargetTable
eingefügt, wobei der Wert von target_date
als einer der Spaltennamen übergeben wird. Zum Schluss wird die Tabelle DataForTargetDate
gelöscht und rows_added
zurückgegeben.
CREATE PROCEDURE mydataset.SelectFromTablesAndAppend(
target_date DATE, OUT rows_added INT64)
BEGIN
CREATE TEMP TABLE DataForTargetDate AS
SELECT t1.id, t1.x, t2.y
FROM dataset.partitioned_table1 AS t1
JOIN dataset.partitioned_table2 AS t2
ON t1.id = t2.id
WHERE t1.date = target_date
AND t2.date = target_date;
SET rows_added = (SELECT COUNT(*) FROM DataForTargetDate);
SELECT id, x, y, target_date -- note that target_date is a parameter
FROM DataForTargetDate;
DROP TABLE DataForTargetDate;
END;
Im folgenden Beispiel wird eine Variable rows_added
deklariert und zusammen mit dem Wert von CURRENT_DATE
als Argument an die Prozedur SelectFromTablesAndAppend
aus dem vorherigen Beispiel übergeben. Anschließend wird in einer Meldung angegeben, wie viele Zeilen hinzugefügt wurden.
DECLARE rows_added INT64;
CALL mydataset.SelectFromTablesAndAppend(CURRENT_DATE(), rows_added);
SELECT FORMAT('Added %d rows', rows_added);
Anweisung ALTER TABLE SET OPTIONS
Mit der DDL-Anweisung ALTER TABLE SET OPTIONS
können Sie die Optionen für eine Tabelle in BigQuery festlegen.
ALTER TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name SET OPTIONS(table_set_options_list)
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Tabelle nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Tabelle nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu ändernde Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu ändernde Tabelle enthält. Die Standardeinstellung ist defaultDataset
in der Anfrage.
table_name
ist der Name der Tabelle, die geändert werden soll.
table_set_options_list
Mit der Optionsliste können Sie Tabellenoptionen wie ein Label oder eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Eine Tabellenoptionsliste muss im folgenden Format angegeben werden:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
partition_expiration_days |
|
Beispiel: Dieses Attribut entspricht dem Attribut timePartitioning.expirationMs der Tabellenressource, verwendet jedoch Tage anstelle von Millisekunden. Ein Tag entspricht 86.400.000 Millisekunden oder 24 Stunden. Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist. |
require_partition_filter |
|
Beispiel: Dieses Attribut entspricht dem Attribut timePartitioning.requirePartitionFilter der Tabellenressource. Dieses Attribut kann nur festgelegt werden, wenn die Tabelle partitioniert ist. |
kms_key_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut encryptionConfiguration.kmsKeyName der Tabellenressource. Weitere Informationen finden Sie unter Daten mit Cloud KMS-Schlüsseln schützen. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
VALUE
ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null
ergibt, wird die entsprechende Option NAME
ignoriert.
Der konstante Ausdruck darf Folgendes nicht enthalten:
- Einen Verweis auf eine Tabelle
- Unterabfragen – SQL-Anweisungen wie
SELECT
,CREATE
undUPDATE
- Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
- Die folgenden Skalarfunktionen:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
Mit der Einstellung VALUE
wird der vorhandene Wert dieser Option für die Tabelle ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE
den Wert NULL
festlegen, wird der Wert der Tabelle für diese Option gelöscht.
Beispiele
Ablaufzeitstempel und Beschreibung für eine Tabelle festlegen
Im folgenden Beispiel wird der Ablaufzeitstempel für eine Tabelle auf sieben Tage nach dem Ausführungszeitpunkt der ALTER TABLE
-Anweisung festgelegt. Außerdem wird eine Beschreibung angegeben:
ALTER TABLE mydataset.mytable SET OPTIONS ( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY), description="Table that expires seven days from now" )
Erforderliches Partitionsfilterattribut für partitionierte Tabelle festlegen
Im folgenden Beispiel wird das Attribut timePartitioning.requirePartitionFilter
für eine partitionierte Tabelle festgelegt.
ALTER TABLE mydataset.mypartitionedtable SET OPTIONS (require_partition_filter=true)
Abfragen, die auf diese Tabelle verweisen, müssen einen Filter für die Partitionierungsspalte verwenden. Andernfalls gibt BigQuery einen Fehler zurück. Durch die Auswahl von true
können Sie Fehler bei der Abfrage vermeiden, da nur die vorgesehenen Daten abgefragt werden.
Ablaufzeitstempel für eine Tabelle löschen
Im folgenden Beispiel wird der Ablaufzeitstempel für eine Tabelle gelöscht, sodass es nicht zu einem Ablauf kommt:
ALTER TABLE mydataset.mytable SET OPTIONS (expiration_timestamp=NULL)
ALTER TABLE ADD COLUMN
-Anweisung
Mit der ALTER TABLE ADD COLUMN
-Anweisung werden einem vorhandenen Tabellenschema eine oder mehrere neue Spalten hinzugefügt. Weitere Informationen zu Schemaänderungen in BigQuery finden Sie unter Tabellenschemas ändern.
ALTER TABLE [[project_name.]dataset_name.]table_name
ADD COLUMN [IF NOT EXISTS] column_name column_schema [, ...]
Dabei gilt:
project_name
ist der Name des Projekts, das die Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.dataset_name
ist der Name des Datasets, das die Tabelle enthält.table_name
ist der Name der Tabelle, die geändert werden soll. Die Tabelle muss bereits vorhanden sein und ein Schema haben.column_name
ist der Name der Spalte, die hinzugefügt werden soll.column_schema
ist das Schema der Spalte. Dieses Schema verwendet dieselbe Syntax wie das Spaltenschema für dieCREATE TABLE
-Anweisung.
Mit dieser Anweisung können Sie Folgendes nicht erstellen:
- Partitionierte Spalten
- Geclusterte Spalten
- Verschachtelte Spalten in vorhandenen
RECORD
-Feldern
Sie können einem vorhandenen Tabellenschema keine REQUIRED
-Spalte hinzufügen. Sie können jedoch eine verschachtelte Spalte vom Typ REQUIRED
als Teil des neuen RECORD
-Felds erstellen.
Ohne die IF NOT EXISTS
-Klausel gibt die Anweisung einen Fehler zurück, wenn die Tabelle bereits eine Spalte mit diesem Namen enthält. Wenn die IF NOT EXISTS
-Klausel enthalten und der Spaltenname bereits vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
Der Wert der neuen Spalte für vorhandene Zeilen wird auf einen der folgenden Werte gesetzt:
NULL
, wenn die neue Spalte mit dem ModusNULLABLE
hinzugefügt wurde. Dies ist der Standardmodus.- Eine leeres
ARRAY
, wenn die neue Spalte mit dem ModusREPEATED
hinzugefügt wurde.
Beispiele
Spalten hinzufügen
Im nachfolgenden Beispiel werden die folgenden Spalten einer vorhandenen Tabelle mit dem Namen mytable
hinzugefügt:
- Spalte
A
vom TypSTRING
- Spalte
B
vom TypGEOGRAPHY
- Spalte
C
vom TypNUMERIC
mit dem ModusREPEATED
- Spalte
D
vom TypDATE
mit einer Beschreibung
ALTER TABLE mydataset.mytable
ADD COLUMN A STRING,
ADD COLUMN IF NOT EXISTS B GEOGRAPHY,
ADD COLUMN C ARRAY<NUMERIC>,
ADD COLUMN D DATE OPTIONS(description="my description")
Wenn eine der Spalten A
, C
oder D
bereits vorhanden ist, schlägt die Anweisung fehl.
Wenn die Spalte B
bereits vorhanden ist, wird die Anweisung aufgrund der IF NOT
EXISTS
-Klausel erfolgreich ausgeführt.
Spalte RECORD
hinzufügen
Im folgenden Beispiel wird eine Spalte namens A
vom Typ STRUCT
hinzugefügt, die die folgenden verschachtelten Spalten enthält:
- Spalte
B
vom TypGEOGRAPHY
- Spalte
C
vom TypINT64
mit dem ModusREPEATED
- Spalte
D
vom TypINT64
mit dem ModusREQUIRED
- Spalte
E
vom TypTIMESTAMP
mit einer Beschreibung
ALTER TABLE mydataset.mytable
ADD COLUMN A STRUCT<
B GEOGRAPHY,
C ARRAY<INT64>,
D INT64 NOT NULL,
E TIMESTAMP OPTIONS(description="creation time")
>
Die Abfrage schlägt fehl, wenn die Tabelle bereits eine Spalte namens A
enthält, auch wenn diese Spalte keine der angegebenen verschachtelten Spalten enthält.
Für die neue STRUCT
-Spalte mit dem Namen A
sind Nullwerte zulässig. Die verschachtelte Spalte D
innerhalb von A
ist jedoch für alle STRUCT
-Werte von A
erforderlich.
ALTER VIEW SET OPTIONS
-Anweisung
Mit der DDL-Anweisung ALTER VIEW SET OPTIONS
können Sie die Optionen für eine Ansicht in BigQuery festlegen.
ALTER VIEW [IF EXISTS] [[project_name.]dataset_name.]view_name SET OPTIONS(view_set_options_list)
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu ändernde Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu ändernde Ansicht enthält. Die Standardeinstellung ist defaultDataset
in der Anfrage.
view_name
ist der Name der Ansicht, die geändert werden soll.
view_set_options_list
Mit der Optionsliste können Sie Ansichtsoptionen wie ein Label und eine Ablaufzeit festlegen. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Die Liste der Ansichtsoptionen müssen Sie im folgenden Format angeben:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
VALUE
ist ein konstanter Ausdruck, der nur Literale, Suchparameter und Skalarfunktionen enthält. Wenn der konstante Ausdruck null
ergibt, wird die entsprechende Option NAME
ignoriert.
Der konstante Ausdruck darf Folgendes nicht enthalten:
- Einen Verweis auf eine Tabelle
- Unterabfragen – SQL-Anweisungen wie
SELECT
,CREATE
undUPDATE
- Benutzerdefinierte Funktionen, Aggregatfunktionen oder Analysefunktionen
- Die folgenden Skalarfunktionen:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
Mit der Einstellung VALUE
wird der vorhandene Wert dieser Option für die Ansicht ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE
den Wert NULL
festlegen, wird der Wert der Ansicht für diese Option gelöscht.
Beispiele
Ablaufzeitstempel und Beschreibung für eine Ansicht festlegen
Im folgenden Beispiel wird der Ablaufzeitstempel für eine Ansicht auf sieben Tage nach dem Ausführungszeitpunkt der ALTER VIEW
-Anweisung festgelegt. Außerdem wird eine Beschreibung angegeben:
ALTER VIEW mydataset.myview SET OPTIONS ( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY), description="View that expires seven days from now" )
ALTER MATERIALIZED VIEW SET OPTIONS
-Anweisung
Mit der DDL-Anweisung ALTER MATERIALIZED VIEW SET OPTIONS
können Sie die Optionen für eine materialisierte Ansicht in BigQuery festlegen.
ALTER MATERIALIZED VIEW [IF EXISTS] [[project_name.]dataset_name.]materialized_view_name SET OPTIONS(materialized_view_set_options_list)
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu ändernde materialisierte Ansicht enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu ändernde materialisierte Ansicht enthält. Die Standardeinstellung ist defaultDataset
in der Anfrage.
materialized_view_name
ist der Name der materialisierten Ansicht, die geändert werden soll.
materialized_view_set_options_list
In der Optionsliste können Sie Optionen für die materialisierte Ansicht festlegen, beispielsweise ob die Aktualisierung aktiviert ist, das Aktualisierungsintervall, ein Label und eine Ablaufzeit. Sie haben auch die Möglichkeit, mehrere Optionen mithilfe einer durch Kommas getrennten Liste anzugeben.
Geben Sie eine Optionsliste für die materialisierte Ansicht im folgenden Format an:
NAME=VALUE, ...
NAME
und VALUE
müssen mit einer der folgenden Varianten kombiniert werden:
NAME |
VALUE |
Details |
---|---|---|
enable_refresh |
BOOLEAN |
Beispiel: |
refresh_interval_minutes |
FLOAT64 |
Beispiel: |
expiration_timestamp |
TIMESTAMP |
Beispiel: Dieses Attribut entspricht dem Attribut expirationTime der Tabellenressource. |
friendly_name |
|
Beispiel: Dieses Attribut entspricht dem Attribut friendlyName der Tabellenressource. |
description |
|
Beispiel: Dieses Attribut entspricht dem Attribut description der Tabellenressource. |
labels |
|
Beispiel: Dieses Attribut entspricht dem Attribut labels der Tabellenressource. |
Mit der Einstellung VALUE
wird der vorhandene Wert dieser Option für die materialisierte Ansicht ersetzt, wenn diese vorhanden ist. Wenn Sie für VALUE
den Wert NULL
festlegen, wird der Wert der materialisierten Ansicht für diese Option gelöscht.
Beispiele
Den Aktualisierungsstatus und das Aktualisierungsintervall für eine materialisierte Ansicht festlegen
Im folgenden Beispiel wird die Aktualisierung aktiviert und das Aktualisierungsintervall für eine materialisierte Ansicht auf 20 Minuten festgelegt:
ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
enable_refresh=true,
refresh_interval_minutes=20
)
DROP TABLE
-Anweisung
Mit der DDL-Anweisung DROP TABLE
können Sie eine Tabelle in BigQuery löschen.
DROP TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Tabelle nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Tabelle nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu löschende Tabelle enthält.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu löschende Tabelle enthält.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
table_name
ist der Name der zu löschenden Tabelle.
Beispiele
Tabelle löschen
Im folgenden Beispiel wird eine Tabelle mit dem Namen mytable
in mydataset
gelöscht:
DROP TABLE mydataset.mytable
Wenn der Tabellenname nicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Error: Not found: Table myproject:mydataset.mytable
Tabelle nur dann löschen, wenn sie vorhanden ist
Im folgenden Beispiel wird eine Tabelle mit dem Namen mytable
in mydataset
nur dann gelöscht, wenn die Tabelle vorhanden ist. Wenn der Tabellenname im Dataset nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
DROP TABLE IF EXISTS mydataset.mytable
DROP EXTERNAL TABLE
-Anweisung
Mit der DROP EXTERNAL TABLE
-Anweisung wird eine externe Tabelle gelöscht.
DROP EXTERNAL TABLE [IF EXISTS] [[project_name.]dataset_name.]table_name
Dabei gilt:
project_name
ist der Name des Projekts, das die Tabelle enthält. Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt.dataset_name
ist der Name des Datasets, das die Tabelle enthält.table_name
ist der Name der Tabelle, die gelöscht werden soll.
Ohne die IF EXISTS
-Klausel gibt die Anweisung einen Fehler zurück, wenn die externe Tabelle nicht vorhanden ist. Wenn die IF EXISTS
-Klausel enthalten und die Tabelle nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
Wenn table_name
vorhanden ist, aber keine externe Tabelle ist, gibt die Anweisung den folgenden Fehler zurück:
Cannot drop table_name which has type TYPE. An
external table was expected.
Mit der DROP EXTERNAL
-Anweisung wird nur die Definition der externen Tabelle aus BigQuery entfernt. Die am externen Speicherort hinterlegten Daten sind davon nicht betroffen.
Beispiele
Im folgenden Beispiel wird die externe Tabelle mit dem Namen external_table
aus dem Dataset mydataset
gelöscht. Wenn die externe Tabelle nicht vorhanden ist, wird ein Fehler zurückgegeben.
DROP EXTERNAL TABLE mydataset.external_table
Im folgenden Beispiel wird die externe Tabelle mit dem Namen external_table
aus dem Dataset mydataset
gelöscht. Wenn die externe Tabelle nicht vorhanden ist, wird kein Fehler zurückgegeben.
DROP EXTERNAL TABLE IF EXISTS mydataset.external_table
DROP VIEW
-Anweisung
Mit der DDL-Anweisung DROP VIEW
können Sie eine Ansicht in BigQuery löschen.
DROP VIEW [IF EXISTS] [[project_name.]dataset_name.]view_name
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Ansicht nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu löschende Ansicht enthält.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu löschende Ansicht enthält.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
view_name
ist der Name der Ansicht, die gelöscht werden soll.
Beispiele
Ansicht löschen
Im folgenden Beispiel wird eine Ansicht namens myview
in mydataset
gelöscht:
DROP VIEW mydataset.myview
Wenn der Ansichtsname im Dataset nicht vorhanden ist, wird der folgende Fehler zurückgegeben:
Error: Not found: Table myproject:mydataset.myview
Ansicht nur löschen, wenn die Ansicht vorhanden ist
Im folgenden Beispiel wird eine Ansicht mit dem Namen myview
in mydataset
nur dann gelöscht, wenn die Ansicht vorhanden ist. Wenn der Ansichtsname nicht im Dataset vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
DROP VIEW IF EXISTS mydataset.myview
DROP MATERIALIZED VIEW
-Anweisung
Mit der DDL-Anweisung DROP
MATERIALIZED VIEW
können Sie eine materialisierte Ansicht in BigQuery löschen.
DROP MATERIALIZED VIEW [IF EXISTS] [[project_name.]dataset_name.]mv_name
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene materialisierte Ansicht nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene materialisierte Ansicht nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu löschende materialisierte Ansicht enthält.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu löschende materialisierte Ansicht enthält.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
mv_name
ist der Name der materialisierten Ansicht, die gelöscht werden soll.
Beispiele
Eine materialisierte Ansicht löschen
Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen my_mv
in mydataset
gelöscht:
DROP MATERIALIZED VIEW mydataset.my_mv
Wenn der Name der materialisierten Ansicht nicht im Dataset vorhanden ist, wird der folgende Fehler zurückgegeben:
Error: Not found: Table myproject:mydataset.my_mv
Wenn Sie eine materialisierte Ansicht in einem anderen Projekt löschen, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view`
(einschließlich der Backticks, wenn project_id
Sonderzeichen enthält); zum Beispiel `myproject.mydataset.my_mv`
.
Eine materialisierte Ansicht nur löschen, wenn sie vorhanden ist
Im folgenden Beispiel wird eine materialisierte Ansicht mit dem Namen my_mv
in mydataset
nur dann gelöscht, wenn die materialisierte Ansicht vorhanden ist. Wenn der Name der materialisierten Ansicht im Dataset nicht vorhanden ist, wird kein Fehler zurückgegeben und keine Aktion ausgeführt.
DROP MATERIALIZED VIEW IF EXISTS mydataset.my_mv
Wenn Sie eine materialisierte Ansicht in einem anderen Projekt löschen, müssen Sie das Projekt, das Dataset und die materialisierte Ansicht im folgenden Format angeben: `project_id.dataset.materialized_view`,
(einschließlich der Backticks, wenn project_id
Sonderzeichen enthält); zum Beispiel `myproject.mydataset.my_mv`
.
DROP FUNCTION
-Anweisung
DROP FUNCTION [IF EXISTS] [[project_name.]dataset_name.]function_name
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn die angegebene Funktion nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn die angegebene Funktion nicht vorhanden ist.
project_name
ist der Name des Projekts, das die zu löschende Funktion enthält.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das die zu löschende Funktion enthält.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
function_name
ist der Name der Funktion, die Sie löschen möchten.
Beispiele
Mit der folgenden Beispielanweisung wird die Funktion parseJsonAsStruct
im Dataset mydataset
gelöscht.
DROP FUNCTION mydataset.parseJsonAsStruct;
Mit der folgenden Beispielanweisung wird die Funktion parseJsonAsStruct
im Dataset sample_dataset
des Projekts other_project
gelöscht.
DROP FUNCTION `other_project`.sample_dataset.parseJsonAsStruct;
DROP PROCEDURE
-Anweisung
DROP PROCEDURE [IF EXISTS] [[project_name.]dataset_name.]procedure_name
Dabei gilt:
IF EXISTS
: Wenn dies vorhanden ist, ist die Abfrage erfolgreich, wenn das angegebene Verfahren nicht vorhanden ist. Wenn es fehlt, schlägt die Abfrage fehl, wenn das angegebene Verfahren nicht vorhanden ist.
project_name
ist der Name des Projekts, das das zu löschende Verfahren enthält.
Die Standardeinstellung ist das Projekt, das diese DDL-Abfrage ausführt. Wenn der Projektname Sonderzeichen wie Doppelpunkte enthält, sollte er in Backticks (`
) gesetzt werden (Beispiel: `google.com:my_project`
).
dataset_name
ist der Name des Datasets, das das zu löschende Verfahren enthält.
Die Standardeinstellung ist defaultDataset
in der Anfrage.
procedure_name
ist der Name des zu löschenden Verfahrens.
Beispiele
Mit der folgenden Beispielanweisung wird die Prozedur myprocedure
im Dataset mydataset
gelöscht.
DROP PROCEDURE mydataset.myProcedure;
Mit der folgenden Beispielanweisung wird die Prozedur myProcedure
im Dataset sample_dataset
des Projekts other_project
gelöscht.
DROP PROCEDURE `other-project`.sample_dataset.myprocedure;