Catalogustabellen maken en er query's op uitvoeren

Voltooid

Tot nu toe hebben we rekening gehouden met Delta Lake-tabelexemplaren die zijn gemaakt op basis van dataframes en zijn gewijzigd via de Delta Lake-API. U kunt Delta Lake-tabellen ook definiƫren als catalogustabellen in de metastore en ermee werken met behulp van SQL.

Externe versus beheerde tabellen

Tabellen in een Spark-catalogus, waaronder Delta Lake-tabellen, kunnen worden beheerd of extern. Het is belangrijk om inzicht te krijgen in het onderscheid tussen dit soort tabellen.

  • Een beheerde tabel wordt gedefinieerd zonder een opgegeven locatie en de gegevensbestanden worden opgeslagen in de opslag die wordt gebruikt door de metastore. Als u de tabel verwijdert, worden niet alleen de metagegevens uit de catalogus verwijderd, maar ook de map waarin de gegevensbestanden worden opgeslagen.
  • Er wordt een externe tabel gedefinieerd voor een aangepaste bestandslocatie, waar de gegevens voor de tabel worden opgeslagen. De metagegevens voor de tabel worden gedefinieerd in de Spark-catalogus. Als u de tabel verwijdert, worden de metagegevens uit de catalogus verwijderd, maar heeft dit geen invloed op de gegevensbestanden.

Catalogustabellen maken

Er zijn verschillende manieren om catalogustabellen te maken.

Een catalogustabel maken op basis van een dataframe

U kunt beheerde tabellen maken door een dataframe te schrijven met behulp van de saveAsTable bewerking, zoals wordt weergegeven in de volgende voorbeelden:

# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")

## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")

Een catalogustabel maken met BEHULP van SQL

U kunt ook een catalogustabel maken met behulp van de CREATE TABLE SQL-instructie met de USING DELTA component en een optionele LOCATION parameter voor externe tabellen. U kunt de instructie uitvoeren met behulp van de SparkSQL-API, zoals in het volgende voorbeeld:

spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")

U kunt ook de systeemeigen SQL-ondersteuning in Spark gebruiken om de instructie uit te voeren:

%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Tip

De CREATE TABLE instructie retourneert een fout als er al een tabel met de opgegeven naam in de catalogus bestaat. U kunt dit gedrag beperken door een CREATE TABLE IF NOT EXISTS instructie of instructie CREATE OR REPLACE TABLE te gebruiken.

Het tabelschema definiƫren

In alle voorbeelden tot nu toe wordt de tabel gemaakt zonder een expliciet schema. In het geval van tabellen die zijn gemaakt door een dataframe te schrijven, wordt het tabelschema overgenomen van het dataframe. Bij het maken van een externe tabel wordt het schema overgenomen van alle bestanden die momenteel zijn opgeslagen op de tabellocatie. Wanneer u echter een nieuwe beheerde tabel of een externe tabel met een momenteel lege locatie maakt, definieert u het tabelschema door de kolomnamen, typen en null-waarde op te geven als onderdeel van de instructie CREATE TABLE; zoals weergegeven in het volgende voorbeeld:

%sql

CREATE TABLE ManagedSalesOrders
(
    Orderid INT NOT NULL,
    OrderDate TIMESTAMP NOT NULL,
    CustomerName STRING,
    SalesTotal FLOAT NOT NULL
)
USING DELTA

Wanneer u Delta Lake gebruikt, worden tabelschema's afgedwongen. Alle invoegingen en updates moeten voldoen aan de opgegeven kolom-nullbaarheid en gegevenstypen.

De DeltaTableBuilder-API gebruiken

U kunt de DeltaTableBuilder-API (onderdeel van de Delta Lake-API) gebruiken om een catalogustabel te maken, zoals wordt weergegeven in het volgende voorbeeld:

from delta.tables import *

DeltaTable.create(spark) \
  .tableName("default.ManagedProducts") \
  .addColumn("Productid", "INT") \
  .addColumn("ProductName", "STRING") \
  .addColumn("Category", "STRING") \
  .addColumn("Price", "FLOAT") \
  .execute()

Net als bij de CREATE TABLE SQL-instructie retourneert de create methode een fout als er al een tabel met de opgegeven naam bestaat. U kunt dit gedrag beperken met behulp van de createIfNotExists of createOrReplace methode.

Catalogustabellen gebruiken

U kunt catalogustabellen, zoals tabellen in een relationele SQL-database, query's uitvoeren en bewerken met behulp van standaard SQL-instructies. In het volgende codevoorbeeld wordt bijvoorbeeld een instructie gebruikt om een SELECT query uit te voeren op de tabel ManagedSalesOrders :

%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders