Werken met externe tabellen

In Unity Catalog slaat een externe tabel de gegevensbestanden op in de opslag van cloudobjecten in uw cloudtenant. Unity Catalog blijft de metagegevens van de tabel beheren en zorgt voor volledig gegevensbeheer voor alle query's. De levenscyclus, optimalisatie, opslaglocatie of indeling van de gegevens worden echter niet beheerd.

Wanneer u een externe tabel van Unity Catalog definieert, moet u een opslaglocatie opgeven. Deze locatie is een externe locatie die is geregistreerd in Unity Catalog. Wanneer u een externe tabel verwijdert, verwijdert Unity Catalog de metagegevens van de tabel, maar worden de onderliggende gegevensbestanden niet verwijderd.

Deze pagina is gericht op externe tabellen van Unity Catalog. Externe tabellen in de verouderde Hive-metastore hebben verschillende gedragingen. Zie Databaseobjecten in de verouderde Hive-metastore.

Wanneer externe tabellen gebruiken

Databricks raadt het gebruik van externe tabellen aan voor de volgende use cases:

  • U moet een tabel registreren die wordt ondersteund door bestaande gegevens die niet compatibel zijn met door Unity Catalog beheerde tabellen, zoals JSON of Avro. Zie Bestandsindelingen voor externe tabellen.
  • U hebt directe toegang nodig tot de gegevens van niet-Databricks-clients die geen ondersteuning bieden voor andere externe toegangspatronen. Unity Catalog-bevoegdheden worden niet afgedwongen wanneer gebruikers toegang hebben tot gegevensbestanden van externe systemen. Zie Toegang tot Databricks-gegevens met behulp van externe systemen.

In de meeste gevallen raadt Databricks aan om beheerde tabellen van Unity Catalog te gebruiken om te profiteren van automatische tabeloptimalisatie, snellere queryprestaties en lagere kosten. Zie Externe of vreemde Delta Lake-tabellen converteren naar door Unity Catalog beheerde tabellen om externe tabellen naar beheerde tabellen te migreren.

Belangrijk

Als u metagegevens van externe tabellen bijwerkt met behulp van een niet-Databricks-client of met behulp van padgebaseerde toegang vanuit Databricks, worden de metagegevens niet automatisch gesynchroniseerd met Unity Catalog. Databricks raadt aan tegen dergelijke metagegevensupdates, maar als u er een uitvoert, moet u MSCK REPAIR TABLE <table-name> SYNC METADATA uitvoeren om het schema in Unity Catalog up-to-date te brengen. Zie REPAIR TABLE.

Bestandsindelingen voor externe tabellen

Externe tabellen kunnen de volgende bestandsindelingen gebruiken:

  • DELTA
  • CSV-bestand
  • JSON
  • AVRO
  • PARKET
  • orc
  • Tekst

Een externe tabel maken

U kunt externe tabellen maken met behulp van SQL-opdrachten of DataFrame-schrijfbewerkingen.

Voordat u begint

Voordat u een externe tabel maakt, moet u eerst een externe locatie configureren die toegang verleent tot uw cloudopslag.

Zie Connect to an Azure Data Lake Storage Gen2 (ADLS Gen2) external location voor meer informatie over het configureren van externe locaties.

Als u een externe tabel wilt maken, moet u voldoen aan de volgende machtigingsvereisten:

  • De bevoegdheid CREATE EXTERNAL TABLE op een externe locatie die toegang verleent tot de LOCATION waartoe de externe tabel toegang heeft.
  • De USE CATALOG machtiging voor de bovenliggende catalogus van de tabel.
  • De USE SCHEMA permissie voor het bovenliggende schema van de tabel.
  • De CREATE TABLE permissie voor het bovenliggende schema van de tabel.

Opmerking

Wanneer een externe S3-locatie is gekoppeld aan meerdere metastores, vermijdt u het verlenen van schrijftoegang tot tabellen die gebruikmaken van die S3-locatie, omdat schrijfbewerkingen van verschillende metastores naar dezelfde externe tabel consistentieproblemen kunnen veroorzaken. Het lezen vanaf dezelfde externe S3-locatie in meerdere metastores is echter veilig.

Voorbeelden

Gebruik een van de volgende voorbeelden in een notebook of de SQL-queryeditor om een externe tabel te maken.

Vervang in de volgende voorbeelden de plaatshouderwaarden.

  • <catalog>: de naam van de catalogus die de tabel bevat.
  • <schema>: de naam van het schema dat de tabel bevat.
  • <table-name>: een naam voor de tabel.
  • <column-name> en <data-type>: de naam en het gegevenstype voor elke kolom.
  • <bucket-path>: het pad naar de cloudopslagbucket waar de tabel wordt gemaakt.
  • <table-directory>: een map waarin de tabel wordt gemaakt. Gebruik een unieke map voor elke tabel.
  • <source-table>: Een tabel die moet worden gebruikt als gegevensbron bij het maken van een tabel op basis van queryresultaten.

SQL

Als u een externe tabel wilt maken in ADLS Gen2 met een gedefinieerd schema, voert u het volgende uit:

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-name> <data-type>
)
LOCATION 'abfss://<bucket-path>/<table-directory>';

Als u een externe tabel in ADLS Gen2 wilt maken op basis van queryresultaten, voert u het volgende uit:

CREATE TABLE <catalog>.<schema>.<table-name>
LOCATION 'abfss://<bucket-path>/<table-directory>'
AS SELECT * FROM <source-table>;

Als u een externe tabel in S3 wilt maken met een gedefinieerd schema, voert u het volgende uit:

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-name> <data-type>
)
LOCATION 's3://<bucket-path>/<table-directory>';

Als u een externe tabel in S3 wilt maken op basis van queryresultaten, voert u het volgende uit:

CREATE TABLE <catalog>.<schema>.<table-name>
LOCATION 's3://<bucket-path>/<table-directory>'
AS SELECT * FROM <source-table>;

Python

Als u een externe tabel wilt maken in ADLS Gen2 met een gedefinieerd schema, voert u het volgende uit:

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", <data-type>())])

spark.createDataFrame([], schema).write \
  .option("path", "abfss://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Als u een externe tabel in ADLS Gen2 wilt maken vanuit een DataFrame, voert u het volgende uit:

df.write \
  .option("path", "abfss://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Als u een externe tabel in S3 wilt maken met een gedefinieerd schema, voert u het volgende uit:

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", <data-type>())])

spark.createDataFrame([], schema).write \
  .option("path", "s3://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Als u een externe tabel in S3 wilt maken vanuit een DataFrame, voert u het volgende uit:

df.write \
  .option("path", "s3://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Zie CREATE TABLEvoor meer informatie over parameters voor het maken van tabellen.

De volgende SQL-syntaxisopties werken met DataFrame-bewerkingen:

Een externe tabel neerzetten

Als u een tabel wilt verwijderen, moet u de eigenaar zijn of de bevoegdheid MANAGE voor de tabel hebben. Als u een externe tabel wilt verwijderen, voert u de volgende opdracht uit:

SQL

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

Python

spark.sql("DROP TABLE IF EXISTS catalog_name.schema_name.table_name")

U kunt ook in Databricks Runtime 18.2 en hoger het volgende gebruiken spark.catalog.dropTable():

spark.catalog.dropTable("catalog_name.schema_name.table_name", ifExists=True)

Unity Catalog verwijdert de onderliggende gegevens in de cloudopslag niet wanneer u een externe tabel neer zet. U moet de onderliggende gegevensbestanden rechtstreeks verwijderen als u gegevens wilt verwijderen die aan de tabel zijn gekoppeld.

voorbeeldnotitieblok: externe tabellen maken

U kunt het volgende voorbeeldnotitieblok gebruiken om een catalogus, schema en externe tabel te maken en machtigingen voor deze tabellen te beheren.

Een externe tabel maken en beheren in Unity Catalog-notebook

Notitieboek ophalen