Creación de tablas delta

Completado

Cuando se crea una tabla en un almacén de lago de Microsoft Fabric, se define una tabla delta en el metastore para el almacén de lago y los datos de la tabla se almacenan en los archivos Parquet subyacentes de la tabla.

Con la mayoría de las herramientas interactivas en el entorno de Microsoft Fabric, se abstraen los detalles de asignación de la definición de tabla en el metastore a los archivos subyacentes. Sin embargo, al trabajar con Apache Spark en un almacén de lago, tiene un mayor control de la creación y administración de tablas delta.

Creación de una tabla delta a partir de un dataframe

Una de las formas más fáciles de crear una tabla delta en Spark es guardar un dataframe en formato delta. Por ejemplo, el siguiente código de PySpark carga un dataframe con datos de un archivo existente y, luego, lo guarda como tabla delta:

# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)

# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")

El código especifica que la tabla debe guardarse en formato delta con un nombre de tabla especificado. Los datos de la tabla se guardan en archivos Parquet (independientemente del formato del archivo de origen que cargó en el dataframe) en el área de almacenamiento Tablas del almacén de lago, junto con una carpeta _delta_log que contiene los registros de transacciones para la tabla. La tabla se muestra en la carpeta Tablas del almacén de lago en el panel Explorador de datos.

Tablas administradas frente a externas

En el ejemplo anterior, el dataframe se guardó como tabla administrada; esto significa que tanto la definición de tabla del metastore como los archivos de datos subyacentes se administran mediante el entorno de ejecución de Spark para el almacén de lago de Fabric. Al eliminar la tabla, también se eliminarán los archivos subyacentes de la ubicación de almacenamiento Tablas del almacén de lago.

También puede crear tablas como tablas externas, en las que la definición de tabla relacional del metastore se asigna a una ubicación de almacenamiento de archivos alternativa. Por ejemplo, el código siguiente crea una tabla externa para la que se almacenan los datos en la carpeta en la ubicación de almacenamiento Archivos del almacén de lago:

df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")

En este ejemplo, la definición de tabla se crea en el metastore (por lo que la tabla aparece en la interfaz de usuario Tablas del almacén de lago), pero los archivos de datos Parquet y los archivos de registro JSON de la tabla se almacenan en la ubicación de almacenamiento Archivos (y se mostrarán en el nodo Archivos en el panel Explorador de almacén de lago).

También puede especificar una ruta de acceso absoluta para una ubicación de almacenamiento, como esta:

df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")

Al eliminar una tabla externa del metastore de almacén de lago, no se eliminan los archivos de datos asociados.

Creación de metadatos de la tabla

Aunque es habitual crear una tabla a partir de los datos existentes en un dataframe, a menudo hay escenarios en los que desea crear una definición de tabla en el metastore que se rellenará con datos de otras maneras. Hay varias formas de lograr este objetivo.

Uso de DeltaTableBuilder API

DeltaTableBuilder API permite escribir código de Spark para crear una tabla en función de las especificaciones. Por ejemplo, el código siguiente crea una tabla con un nombre y columnas especificados.

from delta.tables import *

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

Uso de Spark SQL

También puede crear tablas delta mediante la instrucción CREATE TABLE de Spark SQL, como se muestra en este ejemplo:

%%sql

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

En el ejemplo anterior se crea una tabla administrada. También puede crear una tabla externa mediante la especificación de un parámetro LOCATION, como se muestra aquí:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'

Al crear una tabla externa, el esquema de la tabla viene determinado por los archivos Parquet que contienen los datos en la ubicación especificada. Este enfoque puede resultar de utilidad si desea crear una definición de tabla que haga referencia a los datos que ya se han guardado en formato delta, o en función de una carpeta en la que espera ingerir datos en formato delta.

Guardado de datos en formato delta

Hasta ahora, ha visto cómo guardar un dataframe como tabla delta (mediante la creación de la definición de esquema de tabla en el metastore y los archivos de datos en formato delta) y cómo crear la definición de tabla (que crea el esquema de tabla en el metastore sin guardar ningún archivo de datos). Una tercera posibilidad es guardar los datos en formato delta sin crear una definición de tabla en el metastore. Este enfoque puede resultar de utilidad si desea conservar los resultados de las transformaciones de datos realizadas en Spark en un formato de archivo en el que más adelante puede "superponer" un proceso o una definición de tabla directamente mediante Delta Lake API.

Por ejemplo, el siguiente código PySpark guarda un dataframe en una nueva ubicación de carpeta en formato delta:

delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)

Los archivos Delta se guardan en formato Parquet en la ruta de acceso especificada e incluyen una carpeta _delta_log que contiene archivos de registro de transacciones. Los registros de transacciones registran los cambios en los datos, como las actualizaciones realizadas en tablas externas o a través de la API de Delta Lake.

Puede reemplazar el contenido de una carpeta existente por los datos de un dataframe mediante el modo sobrescribir, como se muestra aquí:

new_df.write.format("delta").mode("overwrite").save(delta_path)

También puede agregar filas de un dataframe a una carpeta existente mediante el modo anexar:

new_rows_df.write.format("delta").mode("append").save(delta_path)

Sugerencia

Si usa la técnica que se describe aquí para guardar un dataframe en la ubicación Tablas del almacén de lago, Microsoft Fabric utilizará una funcionalidad de detección de tablas automática para crear los metadatos de la tabla correspondientes en el metastore.