Creación de tablas de catálogo
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.