Внутренне этот класс управляет воспроизведением действий, сохраненных в контрольной точке или дельта-файл
Как правило, этот «снимок» использует дельта-кодирование и косвенно допускает изоляцию снимка .
Практически дельта-кодирование запоминает каждую побочную операцию, такую как INSERT DELETE UPDATE, которую вы выполняли со времени последней контрольной точки. В случае дельты озера это будет SingleAction
( source ): AddFile (вставить) RemoveFile (удалить). Концептуально этот подход близок к источнику событий - без него вам пришлось бы буквально хранить / транслировать все состояние (базу данных или каталог) при каждом обновлении. Он также используется во многих классовых c ACID базах данных с репликацией.
В целом это дает вам:
- возможность непрерывно реплицировать состояние файловой системы / каталога / базы данных (см. * 1021) * SnapshotManagement.update ). По сути, именно поэтому вы видите много
first at Snapshot.scala:1
- оно вызывается для того, чтобы отслеживать журнал каждый раз, когда вы начинаете транзакцию, см. DeltaLog.startTransaction . Я не смог найти TransactionalWriteEdge
источников, но, полагаю, он вызывается примерно в одно и то же время. - способность восстанавливать состояние путем воспроизведения каждого действия с момента последнего снимка.
- способность изолировать (и хранить) транзакции, храня их снимки отдельно до фиксации (каждый
SingleAction
имеет txn для изоляции). Для этого Delta-lake использует optimisti c lock : фиксация транзакции завершится неудачей, если их журналы не будут объединяемыми, а читатели не увидят незавершенные действия.
PS Вы можете увидеть, что доступ к журналу осуществляется в строке val deltaData = load(files)
, а действия располагаются поверх previousSnapshot
(val checkpointData = previousSnapshot.getOrElse(emptyActions); val allActions = checkpointData.union(deltaData)
)