Delta Lake¶
This page explains how you can work with Delta Lake tables in your Unity Catalog.
To follow along, make sure you have a local instance of Unity Catalog running by launching the following command from a terminal window:
bin/start-uc-server
This local UC server will come with some sample data pre-loaded.
You can list all the tables in your Unity Catalog using:
bin/uc table list --catalog unity --schema default
Your output should look something like this:
┌────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┐
│ NAME │ CATALOG_NAME │ SCHEMA_NAME │ TABLE_TYPE │DATA_SOURCE_FORM│ COLUMNS │STORAGE_LOCATION│ COMMENT │ PROPERTIES │ CREATED_AT │ UPDATED_AT │ TABLE_ID │
│ │ │ │ │ AT │ │ │ │ │ │ │ │
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│user_coun...│unity │default │EXTERNAL │DELTA │[{"name":"fir...│file:///Users...│Partitioned t...│{} │1721238005622 │1721238005622 │26ed93b5-9a18...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│numbers │unity │default │EXTERNAL │DELTA │[{"name":"as_...│file:///Users...│External table │{"key1":"valu...│1721238005617 │1721238005617 │32025924-be53...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│marksheet...│unity │default │EXTERNAL │DELTA │[{"name":"id"...│file:///tmp/m...│Uniform table │{"key1":"valu...│1721238005611 │1721238005611 │9a73eb46-adf0...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│marksheet │unity │default │MANAGED │DELTA │[{"name":"id"...│file:///Users...│Managed table │{"key1":"valu...│1721238005595 │1721238005595 │c389adfa-5c8f...│
└────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┘
As you can see, there are 4 tables in this catalog. All 4 tables are in the DELTA format.
Let's take a look at how we can work with these Delta Lake tables.
How to Get Table Metadata¶
Delta Lake tables have rich metadata. You can use the bin/uc table get ...
command to take a look at a table's metadata.
Let's take a look at the numbers
table:
bin/uc table get --full_name unity.default.numbers
Your output should look something like this:
┌────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ KEY │ VALUE │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│NAME │numbers │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│CATALOG_NAME │unity │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│SCHEMA_NAME │default │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│TABLE_TYPE │EXTERNAL │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│DATA_SOURCE_FORMAT │DELTA │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│COLUMNS │{"name":"as_int","type_text":"int","type_json":"{\"name\":\"as_int\",\"type\":\"integer\",\"nullable│
│ │\":false,\"metadata\":{}}","type_name":"INT","type_precision":0,"type_scale":0,"type_interval_type":│
│ │null,"position":0,"comment":"Int column","nullable":false,"partition_index":null}│
│ │{"name":"as_double","type_text":"double","type_json":"{\"name\":\"as_double\",\"type\":\"double\",\"│
│ │nullable\":false,\"metadata\":{}}","type_name":"DOUBLE","type_precision":0,"type_scale":0,"type_inte│
│ │rval_type":null,"position":1,"comment":"Double column","nullable":false,"partition_index":null} │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│STORAGE_LOCATION │file:///Users/avriiil/Documents/git/my-forks/unitycatalog/etc/data/external/unity/default/tables/nu│
│ │mbers/ │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│COMMENT │External table │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│PROPERTIES │{"key1":"value1","key2":"value2"} │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│CREATED_AT │1721238005617 │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│UPDATED_AT │1721238005617 │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│TABLE_ID │32025924-be53-4d67-ac39-501a86046c01 │
└────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘
How to Read Delta Tables¶
Use the bin/uc table read ...
command to read your Delta table. You can optionally limit the number of results with the max_results
flag.
bin/uc table read --full_name unity.default.numbers --max_results 3
This should output:
┌───────────────────────────────────────┬──────────────────────────────────────┐
│as_int(integer) │as_double(double) │
├───────────────────────────────────────┼──────────────────────────────────────┤
│564 │188.75535598441473 │
├───────────────────────────────────────┼──────────────────────────────────────┤
│755 │883.6105633023361 │
├───────────────────────────────────────┼──────────────────────────────────────┤
│644 │203.4395591086936 │
└───────────────────────────────────────┴──────────────────────────────────────┘
How to Create a New Delta Table¶
Use the bin/uc table create ...
command to create a new Delta table in your Unity Catalog.
This command has multiple parameters:
full_name
: The full name of the table, which is a concatenation of the catalog name, schema name, and table name separated by dots (e.g., catalog_name.schema_name.table_name).columns
: The columns of the table in SQL-like format "column_name column_data_type". Supported data types include BOOLEAN, BYTE, SHORT, INT, LONG, FLOAT, DOUBLE, DATE, TIMESTAMP, TIMESTAMP_NTZ, STRING, BINARY, DECIMAL. Separate multiple columns with a comma (e.g., "id INT, name STRING").format
: [Optional] The format of the data source. Supported values are DELTA, PARQUET, ORC, JSON, CSV, AVRO, and TEXT. If not specified the default format is DELTA.storage_location
: The storage location associated with the table. It is a mandatory field for EXTERNAL tables.properties
: [Optional] The properties of the entity in JSON format (e.g., '{"key1": "value1", "key2": "value2"}'). Make sure to either escape the double quotes(") inside the properties string or just use single quotes('') around the same.
Run the command below with the correct path/to/storage
to create a new DELTA table with 2 columns: some_numbers
and some_letters
.
You can get the storage location from the STORAGE_LOCATION
field of your bin/uc table get ...
call above.
bin/uc table create --full_name unity.default.test --columns "some_numbers INT, some_letters STRING, some_times TIMESTAMP" --storage_location file:///Users/avriiil/Documents/git/my-forks/unitycatalog/etc/data/external/unity/default/tables/test
This should output:
Table created successfully at: file:///Users/avriiil/Documents/git/my-forks/unitycatalog/etc/data/external/unity/default/tables/test
┌────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ KEY │ VALUE │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│NAME │test │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│CATALOG_NAME │unity │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│SCHEMA_NAME │default │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│TABLE_TYPE │EXTERNAL │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│DATA_SOURCE_FORMAT │DELTA │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│COLUMNS │{"name":"some_numbers","type_text":"int","type_json":"{\"name\":\"some_numbers\",\"type\":\"integer\│
│ │",\"nullable\":true,\"metadata\":{}}","type_name":"INT","type_precision":0,"type_scale":0,"type_inte│
│ │rval_type":null,"position":0,"comment":null,"nullable":true,"partition_index":null} │
│ │{"name":"some_letters","type_text":"string","type_json":"{\"name\":\"some_letters\",\"type\":\"strin│
│ │g\",\"nullable\":true,\"metadata\":{}}","type_name":"STRING","type_precision":0,"type_scale":0,"type│
│ │_interval_type":null,"position":1,"comment":null,"nullable":true,"partition_index":null} │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│STORAGE_LOCATION │file:///Users/avriiil/Documents/git/my-forks/unitycatalog/etc/data/external/unity/default/tables/te │
│ │st2 │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│COMMENT │null │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│PROPERTIES │{} │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│CREATED_AT │1721644623209 │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│UPDATED_AT │1721644623209 │
├────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│TABLE_ID │2e8b23f2-4ff7-4a10-8d23-b8c7bae2bdb0 │
└────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘
How to Write to Delta Tables¶
Use the bin/uc write ...
command to write data to a Delta table.
Let's use our new test
table as an example. This table should be empty. Let's confirm:
> bin/uc table read --full_name unity.default.test
┌───────────────────────────────────────┬──────────────────────────────────────┐
│some_numbers(integer) │some_letters(string) │
└───────────────────────────────────────┴──────────────────────────────────────┘
Now use the following command to write some sample data to this table.
bin/uc table write --full_name <catalog>.<schema>.<table>
This is an experimental feature. Currently, this will only write sample data and supports only some primitive data types.
How to Delete a Delta Table¶
Use the bin/uc table delete ...
command to delete a Delta table from your Unity Catalog.
Let's remove the test
table we've just created:
bin/uc table delete --full_name unity.default.test
This will remove the Delta table. Let's confirm by listing the tables in our catalog and schema:
> bin/uc table list --catalog unity --schema default
┌────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┐
│ NAME │ CATALOG_NAME │ SCHEMA_NAME │ TABLE_TYPE │DATA_SOURCE_FORM│ COLUMNS │STORAGE_LOCATION│ COMMENT │ PROPERTIES │ CREATED_AT │ UPDATED_AT │ TABLE_ID │
│ │ │ │ │ AT │ │ │ │ │ │ │ │
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│user_coun...│unity │default │EXTERNAL │DELTA │[{"name":"fir...│file:///Users...│Partitioned t...│{} │1721238005622 │1721238005622 │26ed93b5-9a18...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│numbers │unity │default │EXTERNAL │DELTA │[{"name":"as_...│file:///Users...│External table │{"key1":"valu...│1721238005617 │1721238005617 │32025924-be53...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│marksheet...│unity │default │EXTERNAL │DELTA │[{"name":"id"...│file:///tmp/m...│Uniform table │{"key1":"valu...│1721238005611 │1721238005611 │9a73eb46-adf0...│
├────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤
│marksheet │unity │default │MANAGED │DELTA │[{"name":"id"...│file:///Users...│Managed table │{"key1":"valu...│1721238005595 │1721238005595 │c389adfa-5c8f...│
└────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┘
Nicely done!
Delta Lake with Daft¶
Here is an example of how you can use Delta Lake’s powerful features from Unity Catalog using Daft
You need to have a Unity Catalog server running to connect to.
For testing purposes, you can spin up a local server by running the code below in a terminal:
bin/start-uc-server
Then import Daft and the UnityCatalog abstraction:
import daft
from daft.unity_catalog import UnityCatalog
Next, point Daft to your UC server
unity = UnityCatalog(
endpoint="http://127.0.0.1:8080",
token="not-used",
)
And now you can access your Delta tables stored in Unity Catalog:
> print(unity.list_tables("unity.default"))
['unity.default.numbers', 'unity.default.marksheet_uniform', 'unity.default.marksheet']
> unity_table = unity.load_table("unity.default.numbers")
> df = daft.read_delta_lake(unity_table)
> df.show()
as_int as_double
564 188.755356
755 883.610563
644 203.439559
75 277.880219
42 403.857969
680 797.691220
821 767.799854
484 344.003740
477 380.678561
131 35.443732
294 209.322436
150 329.197303
539 425.661029
247 477.742227
958 509.371273
Take a look at the Integrations page for more examples of working with Delta tables stored in Unity Catalog.