Скажем, у меня есть таблица с именем data
, и это временные ряды. Он хранится так:
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
Где у меня есть два ключа раздела и два раздела для файлов паркета. Я могу легко перечислить файлы для ключей разделов с помощью:
dbfs.fs.ls('/data/date=2022-11-30/region=usa')
Но если я сейчас обновлю таблицу, она перегенерирует файлы паркета, и теперь у меня есть 4 files
в этом каталоге.
Как я могу получить latest version
файлов паркета? Мне действительно нужно перебирать все файлы состояния _delta_log
и перестраивать состояние? Или мне нужно запустить VACCUM
, чтобы очистить старые версии, чтобы я мог получить самые последние файлы?
Должна быть магическая функция.
Delta Lake сама отслеживает всю эту информацию в своем журнале транзакций. Когда вы запрашиваете дельта-таблицу с помощью механизма или API, который поддерживает Delta Lake, под прикрытием он читает этот журнал транзакций, чтобы определить, какие файлы составляют эту версию таблицы.
Например, скажем, четыре файла:
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
part-000003.parquet
part-000004.parquet
Сам журнал дельта-транзакций содержит путь к файлам для каждой версии таблицы, например:
# VO | first version of the table
/data
/date=2022-11-30
/region=usa
part-000001.parquet
part-000002.parquet
# V1 | second version of the table
/data
/date=2022-11-30
/region=usa
part-000003.parquet
part-000004.parquet
Вы можете использовать Delta Standalone , если хотите использовать Scala/JVM для получения списка файлов и/или Delta Rust, чтобы использовать привязки Delta Rust и/или Python.
Если вы хотите сделать это в Spark SQL и/или углубиться в детали, ознакомьтесь с Погружение в Delta Lake: распаковка журнала транзакций , которое включает видео, блог и блокнот по этой теме. Также есть продолжение видео под названием Под отложениями v2.
Круто - обязательно пингуйте нас и на канале Delta Rust, если хотите поболтать/задать вопросы, а?! go.delta.io/slack - ТТФН!
Дэнни, ты даже дал мне выбор языка? Чувак. Эпический. Спасибо. Я возьму Раст.