Creación de tablas de catálogo

Completado

Hasta ahora, hemos considerado las instancias de tablas de Delta Lake creadas a partir de dataframes y modificadas a través de Delta Lake API. También puede definir tablas de Delta Lake como tablas de catálogo en el metastore de Hive para el grupo de Spark y trabajar con ellas mediante SQL.

Comparación de las tablas externas y las administradas

Las tablas de un catálogo de Spark, incluidas las tablas de Delta Lake, pueden ser tablas administradas o externas y es importante comprender la distinción entre ambos tipos.

  • Una tabla administrada se define sin una ubicación especificada y los archivos de datos se almacenan en el almacenamiento que el metastore utiliza. Al quitar la tabla no solo se quitan los metadatos del catálogo, sino que también se elimina la carpeta en la que se almacenan los archivos de datos.
  • Una tabla externa se define para una ubicación de archivo personalizada en la que se almacenan los datos de la tabla. Los metadatos de la tabla se definen en el catálogo de Spark. Al quitar la tabla se eliminan los metadatos del catálogo, pero no afecta a los archivos de datos.

Creación de tablas de catálogo

Existen varias maneras de crear tablas de catálogo.

Creación de una tabla de catálogo a partir de un dataframe

Puede crear tablas administradas al escribir un dataframe mediante la operación saveAsTable, tal como se muestra en los ejemplos siguientes:

# 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")

Creación de una tabla de catálogo mediante SQL

También puede crear una tabla de catálogo mediante la instrucción SQL CREATE TABLE con la cláusula USING DELTA y un parámetro LOCATION opcional para tablas externas. Puede ejecutar la instrucción mediante la API de SparkSQL, como en el ejemplo siguiente:

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

Como alternativa, puede usar la compatibilidad nativa de SQL en Spark para ejecutar la instrucción:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Sugerencia

La instrucción CREATE TABLE devuelve un error si ya existe una tabla con el nombre especificado en el catálogo. Para mitigar este comportamiento, puede utilizar una instrucción CREATE TABLE IF NOT EXISTS o la instrucción CREATE OR REPLACE TABLE.

Definición del esquema de tabla

En todos los ejemplos vistos hasta ahora, la tabla se crea sin un esquema explícito. En el caso de las tablas que se crean al escribir un dataframe, el esquema de tabla se hereda del dataframe. Al crear una tabla externa, el esquema se hereda de los archivos que actualmente están almacenados en la ubicación de la tabla. Sin embargo, al crear una tabla administrada o una tabla externa con una ubicación actualmente vacía, el esquema de tabla se define mediante la especificación de los nombres de columna, los tipos y la nulabilidad como parte de la instrucción CREATE TABLE, tal como se muestra en el ejemplo siguiente:

%%sql

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

Cuando se usa Delta Lake, se aplican esquemas de tabla: todas las inserciones y actualizaciones deben cumplir con los tipos de datos y nulabilidad de columna especificados.

Uso de DeltaTableBuilder API

Puede utilizar DeltaTableBuilder API (como parte de Delta Lake API) para crear una tabla de catálogo, tal como se muestra en el ejemplo siguiente:

from delta.tables import *

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

De manera similar a lo que ocurre con la instrucción SQL CREATE TABLE, el método create devuelve un error si ya existe una tabla con el nombre especificado. Para mitigar este comportamiento, utilice el método createIfNotExists o el método createOrReplace.

Uso de tablas de catálogo

Puede usar tablas de catálogo como tablas en cualquier base de datos relacional basada en SQL, consultarlas y manipularlas mediante instrucciones SQL estándar. Por ejemplo, en el ejemplo de código siguiente se utiliza una instrucción SELECT para consultar la tabla ManagedSalesOrders:

%%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Sugerencia

Para más información sobre cómo trabajar con Delta Lake, consulte el artículo sobre lecturas y escrituras por lotes de tablas en la documentación de Delta Lake.