Tabellenschemas manuell ändern
In diesem Dokument wird beschrieben, wie Sie die Schemadefinition für vorhandene BigQuery-Tabellen manuell ändern. Viele Schemaänderungen werden in BigQuery nicht nativ unterstützt und erfordern manuelle Problemumgehungen. Folgende Schemaänderungen werden nicht unterstützt:
- Name einer Spalte ändern
- Datentyp einer Spalte ändern
- Modus einer Spalte ändern (ausgenommen das Lockern von
REQUIRED
aufNULLABLE
) - Spalte löschen
Weitere Informationen zu unterstützten Schemaänderungen in BigQuery finden Sie unter Tabellenschemas ändern.
Name einer Spalte ändern
Das Umbenennen einer Spalte wird von der Console, dem bq
-Befehlszeilentool oder der API nicht unterstützt. Wenn Sie ein Tabellenschema mit einer umbenannten Spalte aktualisieren, wird der folgende Fehler zurückgegeben: BigQuery error in update operation: Provided Schema does not match Table
project_id:dataset.table
.
Es gibt zwei Möglichkeiten, eine Spalte manuell umzubenennen:
- Über eine SQL-Abfrage: Wählen Sie diese Option, wenn eine unkomplizierte und nutzerfreundliche Lösung für Sie wichtiger ist als die Kosten.
- Durch Neuerstellung der Tabelle: Wählen Sie diese Option, wenn die Kosten für Sie wichtiger sind als eine unkomplizierte und nutzerfreundliche Lösung.
Option 1: Abfragen verwenden
Wählen Sie alle Spalten in der Tabelle aus und geben Sie der Spalte, die Sie umbenennen möchten, einen Alias, um den Namen einer Spalte mithilfe einer SQL-Abfrage zu ändern. Sie können die vorhandene Tabelle mit dem Abfrageergebnis überschreiben oder eine neue Zieltabelle daraus erstellen. Wenn Sie die Spalte mit einem neuen Namen versehen, muss dieser den BigQuery-Regeln für Spaltennamen entsprechen.
Vorteile
- Wenn Sie eine Abfrage verwenden, um die Daten in eine neue Zieltabelle zu schreiben, werden die ursprünglichen Daten beibehalten.
- Wenn Sie die ursprüngliche Tabelle über den Abfragejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Beim Umbenennen einer Spalte über eine Abfrage muss die gesamte Tabelle gescannt werden. Die Abfragegebühren können beträchtlich sein, wenn die Tabelle sehr groß ist.
- Wenn Sie die Abfrageergebnisse in eine neue Zieltabelle schreiben, fallen für die alte und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
- Umbenannte Spalten, die erforderlich waren, können Nullwerte enthalten.
Beispiel für einen Spaltenalias
Im folgenden Beispiel sehen Sie eine Standard-SQL-Abfrage, mit der alle Daten in mytable
ausgewählt werden, mit Ausnahme von zwei Spalten, die umbenannt werden müssen. Es wird ein Alias verwendet, um neue Namen für die zwei Spalten zu generieren. column_one
wird in newcolumn_one
umbenannt und column_two
wird in newcolumn_two
umbenannt. Die vorhandene Tabelle wird mit dem Abfrageergebnis überschrieben.
Console
Wählen Sie in der Console den Abfrageeditor.
Geben Sie im Abfrageeditor die folgende Abfrage ein, um alle Daten in
mydataset.mytable
auszuwählen, mit Ausnahme der beiden Spalten, die umbenannt werden müssen.mydataset.mytable
befindet sich in Ihrem Standardprojekt. In der Abfrage wird ein Alias verwendet, um den Namencolumn_one
innewcolumn_one
und den Namencolumn_two
innewcolumn_two
zu ändern.SELECT * EXCEPT(column_one, column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM mydataset.mytable
Klicken Sie auf More (Mehr) und wählen Sie Query settings (Abfrageeinstellungen) aus.
Gehen Sie im Abschnitt Destination (Ziel) so vor:
Wählen Sie Zieltabelle für Abfrageergebnisse festlegen.
Wählen Sie für Dataset die Option
myproject.mydataset
aus.Geben Sie unter Tabellen-ID
mytable
ein.Wählen Sie für Schreibeinstellung für Zieltabelle die Option Tabelle überschreiben. Bei dieser Einstellung wird
mytable
mit den Abfrageergebnissen überschrieben.
Klicken Sie auf Speichern, um die Einstellungen zu aktualisieren, und klicken Sie dann im Abfrageeditor auf Ausführen. Wenn der Abfragejob abgeschlossen ist, haben die Spalten in
mytable
neue Namen.
bq
Geben Sie den folgenden bq query
-Befehl ein, um alle Daten in mydataset.mytable
auszuwählen, mit Ausnahme der zwei Spalten, die umbenannt werden müssen.
mydataset.mytable
befindet sich in Ihrem Standardprojekt. In der Abfrage wird ein Alias verwendet, um den Namen column_one
in newcolumn_one
und den Namen column_two
in newcolumn_two
zu ändern.
Schreiben Sie die Abfrageergebnisse mit dem Flag --destination_table
in mydataset.mytable
und geben Sie das Flag --replace
an, um mytable
zu überschreiben. Mit dem Flag use_legacy_sql=false
legen Sie die Standard-SQL-Abfragesyntax fest.
Optional: Geben Sie das Flag --location
an und legen Sie als Wert Ihren Standort fest.
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
* EXCEPT(column_one,
column_two),
column_one AS newcolumn_one,
column_two AS newcolumn_two
FROM
mydataset.mytable'
API
Rufen Sie die Methode jobs.insert
auf und konfigurieren Sie einen query
-Job, um den Namen von column_one
in newcolumn_one
und den Namen von column_two
in newcolumn_two
zu ändern. Optional: Geben Sie im Abschnitt jobReference
im Attribut location
Ihren Standort an.
Die im Abfragejob verwendete SQL-Abfrage würde so lauten: SELECT * EXCEPT(column_one,
column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM
mydataset.mytable
. Von dieser Abfrage werden alle Daten in mytable
mit Ausnahme der zwei Spalten ausgewählt, die umbenannt werden müssen. Es wird ein Alias verwendet, um neue Namen für die zwei Spalten zu generieren.
Fügen Sie mydataset.mytable
im Attribut configuration.query.destinationTable
hinzu und geben Sie WRITE_TRUNCATE
im Attribut configuration.query.writeDisposition
an, um mytable
mit den Abfrageergebnissen zu überschreiben. Geben Sie im Attribut configuration.query.destinationTable
den Tabellennamen ein, um eine neue Zieltabelle anzugeben.
Option 2: Daten in eine neue Tabelle exportieren und laden
Sie haben noch eine weitere Möglichkeit, um Spalten umzubenennen. Exportieren Sie dazu die Tabellendaten nach Cloud Storage und laden Sie die Daten in eine neue Tabelle mit einer Schemadefinition, die den richtigen Spaltennamen enthält. Außerdem können Sie die vorhandene Tabelle durch den Ladejob überschreiben.
Vorteile
- Für die Export- und Ladejobs entstehen Ihnen keine Gebühren. Derzeit sind BigQuery-Lade- und Exportjobs kostenlos.
- Wenn Sie die ursprüngliche Tabelle über den Ladejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Wenn Sie die Daten in eine neue Tabelle laden, fallen für die ursprüngliche und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
- Es fallen Gebühren für das Speichern der exportierten Daten in Cloud Storage an.
Datentyp einer Spalte ändern
Das Ändern des Datentyps einer Spalte wird von der Console, dem bq
-Befehlszeilentool und der API nicht unterstützt. Beim Versuch, eine Tabelle durch Anwenden eines Schemas zu aktualisieren, in dem ein neuer Datentyp für eine Spalte angegeben wird, wird der folgende Fehler zurückgegeben: BigQuery error in update operation: Provided
Schema does not match Table project_id:dataset.table.
Es gibt zwei Möglichkeiten, den Datentyp einer Spalte manuell zu ändern:
- Über eine SQL-Abfrage: Wählen Sie diese Option, wenn eine unkomplizierte und nutzerfreundliche Lösung für Sie wichtiger ist als die Kosten.
- Durch Neuerstellung der Tabelle: Wählen Sie diese Option, wenn die Kosten für Sie wichtiger sind als eine unkomplizierte und nutzerfreundliche Lösung.
Option 1: Abfragen verwenden
Verwenden Sie eine SQL-Abfrage, wenn Sie alle Tabellendaten auswählen und die entsprechende Spalte in einen anderen Datentyp umwandeln möchten. Mit dem Abfrageergebnis können Sie die Tabelle überschreiben oder eine neue Zieltabelle daraus erstellen.
Vorteile
- Wenn Sie eine Abfrage verwenden, um die Daten in eine neue Zieltabelle zu schreiben, werden die ursprünglichen Daten beibehalten.
- Wenn Sie die ursprüngliche Tabelle über den Abfragejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Beim Ändern des Datentyps einer Spalte über eine Abfrage muss die gesamte Tabelle gescannt werden. Die Abfragegebühren können beträchtlich sein, wenn die Tabelle sehr groß ist.
- Wenn Sie die Abfrageergebnisse in eine neue Zieltabelle schreiben, fallen für die alte und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
Beispiel für CAST
Im folgenden Beispiel sehen Sie eine Standard-SQL-Abfrage, mit der alle Daten aus column_two
und column_three
in mydataset.mytable
ausgewählt werden und column_one
von DATE
in STRING
umgewandelt wird. Die vorhandene Tabelle wird mit dem Abfrageergebnis überschrieben. In der überschriebenen Tabelle wird column_one
als Datentyp STRING
gespeichert.
Eine Abfrage mit CAST
kann fehlschlagen, wenn BigQuery die Umwandlung nicht ausführen kann. Weitere Informationen zu Umwandlungsregeln in Standard-SQL finden Sie in der Referenzdokumentation zu Funktionen und Operatoren unter Umwandeln.
Console
Klicken Sie in der Console auf Neue Abfrage erstellen.
Geben Sie im Abfrageeditor die folgende Abfrage ein, um alle Daten aus
column_two
undcolumn_three
inmydataset.mytable
auszuwählen undcolumn_one
vonDATE
inSTRING
umzuwandeln. In der Abfrage wird ein Alias verwendet, umcolumn_one
mit demselben Namen umzuwandeln.mydataset.mytable
befindet sich in Ihrem Standardprojekt.SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable
Klicken Sie auf Mehr und wählen Sie Abfrageeinstellungen aus.
Aktivieren Sie im Abschnitt Ziel die Option Zieltabelle für Abfrageergebnisse festlegen.
Für die folgenden Felder gilt:
Behalten Sie für Projektname das Standardprojekt als Wert bei. Dies ist das Projekt, das
mydataset.mytable
enthält.Wählen Sie
mydataset
als Dataset-Name aus.Geben Sie im Feld Tabellenname
mytable
ein.Klicken Sie auf OK.
Wählen Sie im Abschnitt Schreibeinstellung für Zieltabelle die Option Tabelle überschreiben als Schreibeinstellung aus. Bei dieser Einstellung wird
mytable
mit den Abfrageergebnissen überschrieben.Optional: Klicken Sie unter Verarbeitungsstandort auf Automatische Auswahl und wählen Sie den Standort Ihrer Daten aus.
Klicken Sie auf Speichern, um die Einstellungen zu aktualisieren, und klicken Sie dann im Abfrageeditor auf Ausführen. Wenn der Abfragejob abgeschlossen ist, hat
column_one
den DatentypSTRING
.
bq
Geben Sie den folgenden bq query
-Befehl ein, um alle Daten aus column_two
und column_three
in mydataset.mytable
auszuwählen und column_one
von DATE
in STRING
umzuwandeln. In der Abfrage wird ein Alias verwendet, um column_one
mit demselben Namen umzuwandeln. mydataset.mytable
befindet sich in Ihrem Standardprojekt.
Die Abfrageergebnisse werden mit dem Flag --destination_table
in mydataset.mytable
geschrieben. Das Flag --replace
wird verwendet, um mytable
zu überschreiben. Mit dem Flag use_legacy_sql=false
legen Sie die Standard-SQL-Abfragesyntax fest.
Optional: Geben Sie das Flag --location
an und legen Sie als Wert Ihren Standort fest.
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
column_two,
column_three,
CAST(column_one AS STRING) AS column_one
FROM
mydataset.mytable'
API
Rufen Sie die Methode jobs.insert
auf und konfigurieren Sie einen query
-Job, um alle Daten aus column_two
und column_three
in mydataset.mytable
auszuwählen und column_one
von DATE
in STRING
umzuwandeln. Optional: Geben Sie im Abschnitt jobReference
im Attribut location
Ihren Standort an.
Die im Abfragejob verwendete SQL-Abfrage würde so lauten: SELECT column_two,
column_three, CAST(column_one AS STRING) AS column_one FROM
mydataset.mytable
. In der Abfrage wird ein Alias verwendet, um column_one
mit demselben Namen umzuwandeln.
Fügen Sie mydataset.mytable
im Attribut configuration.query.destinationTable
hinzu und geben Sie WRITE_TRUNCATE
im Attribut configuration.query.writeDisposition
an, um mytable
mit den Abfrageergebnissen zu überschreiben.
Option 2: Daten in eine neue Tabelle exportieren und laden
Sie haben noch eine weitere Möglichkeit, um den Datentyp einer Spalte zu ändern. Exportieren Sie dazu die Tabellendaten in Cloud Storage und laden Sie die Daten dann in eine neue Tabelle, deren Schemadefinition den richtigen Datentyp für die Spalte angibt. Außerdem können Sie die vorhandene Tabelle durch den Ladejob überschreiben.
Vorteile
- Für die Export- und Ladejobs entstehen Ihnen keine Gebühren. Derzeit sind BigQuery-Lade- und Exportjobs kostenlos.
- Wenn Sie die ursprüngliche Tabelle über den Ladejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Wenn Sie die Daten in eine neue Tabelle laden, fallen für die ursprüngliche und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
- Es fallen Gebühren für das Speichern der exportierten Daten in Cloud Storage an.
Spaltenmodus ändern
Aktuell kann der Spaltenmodus nur von REQUIRED
zu NULLABLE
geändert werden. Die Änderung des Spaltenmodus von REQUIRED
zu NULLABLE
wird auch als Spaltenlockerung bezeichnet. Weitere Informationen zum Lockern der Spalten REQUIRED
zu NULLABLE
finden Sie unter Modus einer Spalte lockern.
Wenn Sie versuchen, eine nicht unterstützte Änderung auf einen Spaltenmodus anzuwenden, wird ein Fehler wie der folgende zurückgegeben. In diesem Beispiel wurde versucht, einen Spaltenmodus von NULLABLE
in REPEATED
zu ändern: BigQuery error in update
operation: Provided Schema does not match Table
project_id:dataset.table. Field
field has changed mode from NULLABLE to REPEATED.
Daten in eine neue Tabelle exportieren und laden
Sie können den Modus einer Spalte manuell ändern. Exportieren Sie dazu die Tabellendaten nach Cloud Storage und laden Sie die Daten dann in eine neue Tabelle mit einer Schemadefinition, die den richtigen Modus für die Spalte angibt. Außerdem können Sie die vorhandene Tabelle durch den Ladejob überschreiben.
Vorteile
- Für die Export- und Ladejobs entstehen Ihnen keine Gebühren. Derzeit sind BigQuery-Lade- und Exportjobs kostenlos.
- Wenn Sie die ursprüngliche Tabelle über den Ladejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Wenn Sie die Daten in eine neue Tabelle laden, fallen für die ursprüngliche und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
- Es fallen Gebühren für das Speichern der exportierten Daten in Cloud Storage an.
Spalten aus Tabellenschema löschen
Das Löschen einer Spalte aus einem Schema einer vorhandenen Tabelle wird von der Console, dem bq
-Befehlszeilentool und der API nicht unterstützt. Wenn Sie versuchen, eine Tabelle zu aktualisieren, indem Sie ein Schema anwenden, mit dem eine Spalte entfernt wird, wird der folgende Fehler zurückgegeben: BigQuery error in update operation: Provided Schema does not
match Table project_id:dataset.table.
Es gibt zwei Möglichkeiten, eine Spalte manuell zu löschen:
- Über eine SQL-Abfrage: Wählen Sie diese Option, wenn eine unkomplizierte und nutzerfreundliche Lösung für Sie wichtiger ist als die Kosten.
- Durch Neuerstellung der Tabelle: Wählen Sie diese Option, wenn die Kosten für Sie wichtiger sind als eine unkomplizierte und nutzerfreundliche Lösung.
Option 1: Abfragen verwenden
Es gibt zwei SQL-Anweisungen, mit denen Sie eine Spalte löschen können:
SELECT * EXCEPT
ALTER TABLE DROP COLUMN
Der folgende Abschnitt zeigt, wie Sie eine SELECT * EXCEPT
-Abfrage verwenden, die die zu entfernende(n) Spalte(n) ausschließt, und das Abfrageergebnis zum Überschreiben der Tabelle oder zum Erstellen einer neuen Zieltabelle verwendet.
Informationen zur Verwendung der Anweisung ALTER TABLE DROP COLUMN
finden Sie in den Beispielen auf der Seite Datendefinitionssprache.
Vorteile
- Wenn Sie eine Abfrage verwenden, um die Daten in eine neue Zieltabelle zu schreiben, werden die ursprünglichen Daten beibehalten.
- Wenn Sie die ursprüngliche Tabelle über den Abfragejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Beim Löschen einer Spalte über eine Abfrage müssen die Daten in allen Spalten gescannt werden, abgesehen von der Spalte, die Sie entfernen. Die Abfragegebühren können beträchtlich sein, wenn die Tabelle sehr groß ist.
- Wenn Sie die Abfrageergebnisse in eine neue Zieltabelle schreiben, fallen für die alte und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
Beispiel für SELECT * EXCEPT
Im folgenden Beispiel sehen Sie eine Standard-SQL-Abfrage, mit der alle Daten in mydataset.mytable
mit Ausnahme von column_two
ausgewählt werden. Die vorhandene Tabelle wird mit dem Abfrageergebnis überschrieben.
Console
Klicken Sie in der Console auf Neue Abfrage erstellen.
Geben Sie im Abfrageeditor die folgende Abfrage ein, um alle Daten in
mydataset.mytable
mit Ausnahme voncolumn_two
auszuwählen.mydataset.mytable
befindet sich in Ihrem Standardprojekt.SELECT * EXCEPT(column_two) FROM mydataset.mytable
Klicken Sie auf Mehr und wählen Sie Abfrageeinstellungen aus.
Aktivieren Sie im Abschnitt Ziel die Option Zieltabelle für Abfrageergebnisse festlegen.
Für die folgenden Felder gilt:
Behalten Sie für Projektname das Standardprojekt als Wert bei. Dies ist das Projekt, das
mydataset.mytable
enthält.Wählen Sie
mydataset
als Dataset-Name aus.Geben Sie im Feld Tabellenname
mytable
ein.Klicken Sie auf OK.
Wählen Sie im Abschnitt Schreibeinstellung für Zieltabelle die Option Tabelle überschreiben als Schreibeinstellung aus. Bei dieser Einstellung wird
mytable
mit den Abfrageergebnissen überschrieben.Optional: Klicken Sie unter Verarbeitungsstandort auf Automatische Auswahl und wählen Sie den Standort Ihrer Daten aus.
Klicken Sie auf Speichern, um die Einstellungen zu aktualisieren, und klicken Sie dann im Abfrageeditor auf Ausführen. Wenn der Abfragejob abgeschlossen ist, sind in der Tabelle jetzt alle Spalten außer
column_two
enthalten.
bq
Geben Sie den folgenden bq query
-Befehl ein, um alle Daten aus mydataset.mytable
mit Ausnahme von column_two
auszuwählen. mydataset.mytable
befindet sich in Ihrem Standardprojekt. Die Abfrageergebnisse werden mit dem Flag --destination_table
in mydataset.mytable
geschrieben. Das Flag --replace
wird verwendet, um mytable
zu überschreiben. Mit dem Flag use_legacy_sql=false
legen Sie die Standard-SQL-Abfragesyntax fest.
Optional: Geben Sie das Flag --location
an und legen Sie als Wert Ihren Standort fest.
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
* EXCEPT(column_two)
FROM
mydataset.mytable'
API
Rufen Sie die Methode jobs.insert
auf und konfigurieren Sie einen query
-Job, um alle Daten aus mydataset.mytable
mit Ausnahme von column_two
auszuwählen. Optional: Geben Sie im Abschnitt jobReference
im Attribut location
Ihren Standort an.
Die im Abfragejob verwendete SQL-Abfrage würde so lauten: SELECT * EXCEPT(column_two)
FROM mydataset.mytable
.
Fügen Sie mydataset.mytable
im Attribut configuration.query.destinationTable
hinzu und geben Sie WRITE_TRUNCATE
im Attribut configuration.query.writeDisposition
an, um mytable
mit den Abfrageergebnissen zu überschreiben.
Option 2: Daten in eine neue Tabelle exportieren und laden
Sie haben noch eine weitere Möglichkeit, um Spalten zu entfernen. Exportieren Sie dazu die Tabellendaten in Cloud Storage, löschen Sie die Daten für die zu entfernenden Spalten und laden Sie die Daten dann in eine neue Tabelle mit einer Schemadefinition, die nicht die entfernten Spalten enthält. Außerdem können Sie die vorhandene Tabelle durch den Ladejob überschreiben.
Vorteile
- Für die Export- und Ladejobs entstehen Ihnen keine Gebühren. Derzeit sind BigQuery-Lade- und Exportjobs kostenlos.
- Wenn Sie die ursprüngliche Tabelle über den Ladejob überschreiben, fallen anstatt für zwei Tabellen nur für eine Speicherkosten an, die ursprünglichen Daten gehen jedoch verloren.
Nachteile
- Wenn Sie die Daten in eine neue Tabelle laden, fallen für die ursprüngliche und die neue Tabelle Speicherkosten an (wenn Sie die alte Tabelle nicht löschen).
- Es fallen Gebühren für das Speichern der exportierten Daten in Cloud Storage an.
Tabellensicherheit
Informationen zum Steuern des Zugriffs auf Tabellen in BigQuery finden Sie unter Einführung in die Tabellenzugriffssteuerung.