工作与三角洲湖表的历史

每个操作,修改一个三角洲湖表创建一个新的表版本。您可以使用历史信息审核操作,回滚表或查询一个表在一个特定时间点上使用时间旅行。

请注意

砖不建议使用三角洲湖表作为一个长期的历史数据归档备份解决方案。砖建议只使用过去7天内上任时间旅行业务的除非你有数据和日志保留配置设置为一个更大的价值。

检索三角洲历史表

您可以检索信息,包括操作、用户和时间戳对于每个写一个三角洲表通过运行历史命令。倒序返回的操作。

表历史保留是由表设置delta.logRetentionDuration,这是默认30天。

请注意

由不同的保留时间旅行和表历史控制阈值。看到三角洲湖时间旅行是什么?

描述历史' /数据/事件/ '——得到的全部历史表描述历史δ' /数据/事件/ '描述历史' /数据/事件/ '限制1——得到最后一个操作描述历史eventsTable

火花的SQL语法细节,请参阅描述历史

看到三角洲湖API文档Scala / Java / Python语法细节。

数据浏览提供了一个可视化视图的三角洲的详细表信息和历史表。除了表模式和样本数据,你可以点击历史选项卡,查看历史显示的表描述历史

历史模式

的输出历史操作有以下列。

类型

描述

版本

表版本生成的操作。

时间戳

时间戳

当这个版本。

用户标识

字符串

用户的ID运行操作。

用户名

字符串

用户运行操作的名称。

操作

字符串

操作的名称。

operationParameters

地图

操作的参数(例如,谓词)。

工作

结构体

工作的细节操作。

笔记本

结构体

笔记本的操作运行的细节。

clusterId

字符串

ID的集群的操作运行。

readVersion

版本的表读执行写操作。

isolationLevel

字符串

隔离级别用于此操作。

isBlindAppend

布尔

这个操作是否附加数据。

operationMetrics

地图

指标的操作(例如,和文件修改的行数)。

userMetadata

字符串

如果是指定用户定义提交元数据

+ - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | + | |版本时间戳userId |操作用户名| | operationParameters | |工作笔记本| clusterId | readVersion | isolationLevel | isBlindAppend | operationMetrics | + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | 5 | 2019-07-29 14:07:47 | # # # # # # | | |删除(谓词- > [" (…零| | # # # # # # | | 4 | WriteSerializable假| | (numTotalRows - >…| | 4 | 2019-07-29 14:07:41 | # # # # # # | | |更新(谓词- > (id…零| | # # # # # # | | 3 | WriteSerializable假| | (numTotalRows - >…| | 3 | 2019-07-29 14:07:29 | # # # # # # | | |删除(谓词- > [" (…零| | # # # # # # | | 2 | WriteSerializable假| | (numTotalRows - >…| | 2 | 2019-07-29 14:06:56 | # # # # # # | | |更新(谓词- > (id…零| | # # # # # # | | 1 | WriteSerializable假| | (numTotalRows - >…| | 1 | 2019-07-29 14:04:31 | # # # # # # | | |删除(谓词- > [" (…零| | # # # # # # | 0 | | WriteSerializable假| | (numTotalRows - >…| | 0 | 2019-07-29 14:01:40 | # # # # # # | | |写[模式- > ErrorIfE……|null| ###| ###| null|WriteSerializable| true|[numFiles -> 2, n...| +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+

请注意

操作指标的钥匙

历史操作返回操作指标的集合operationMetrics列映射。

下面的表列出了地图键定义的操作。

操作

指标名称

描述

写,创建表选择,替代选择表的副本

numFiles

写文件数量。

numOutputBytes

大小的字节写内容。

numOutputRows

写的行数。

流媒体更新

numAddedFiles

文件数量补充道。

numRemovedFiles

数量的文件删除。

numOutputRows

写的行数。

numOutputBytes

写的字节大小。

删除

numAddedFiles

文件数量补充道。没有提供在分区表的删除。

numRemovedFiles

数量的文件删除。

numDeletedRows

删除的行数。没有提供在分区表的删除。

numCopiedRows

复制的行数的过程中删除文件。

executionTimeMs

整个操作时间执行。

scanTimeMs

时间扫描文件匹配。

rewriteTimeMs

时间重写匹配的文件。

截断

numRemovedFiles

数量的文件删除。

executionTimeMs

整个操作时间执行。

合并

numSourceRows

在源DataFrame的行数。

numTargetRowsInserted

插入到目标表的行数。

numTargetRowsUpdated

在目标表更新的行数。

numTargetRowsDeleted

目标表中删除的行数。

numTargetRowsCopied

目标的行数复制。

numOutputRows

总写的行数。

numTargetFilesAdded

数量的文件添加到水槽(目标)。

numTargetFilesRemoved

文件数量从水槽中删除(目标)。

executionTimeMs

整个操作时间执行。

scanTimeMs

时间扫描文件匹配。

rewriteTimeMs

时间重写匹配的文件。

更新

numAddedFiles

文件数量补充道。

numRemovedFiles

数量的文件删除。

numUpdatedRows

更新的行数。

numCopiedRows

的行数只复制在更新文件的过程。

executionTimeMs

整个操作时间执行。

scanTimeMs

时间扫描文件匹配。

rewriteTimeMs

时间重写匹配的文件。

FSCK

numRemovedFiles

数量的文件删除。

转换

numConvertedFiles

拼花已经被转换的文件的数量。

优化

numAddedFiles

文件数量补充道。

numRemovedFiles

文件数量优化。

numAddedBytes

添加表优化后的字节数。

numRemovedBytes

的字节数。

minFileSize

规模最小的文件后,表进行优化。

p25FileSize

后第25百分位文件表的大小进行优化。

p50FileSize

平均文件大小后表进行优化。

p75FileSize

第75个百分位的大小文件后表进行优化。

maxFileSize

最大文件的大小后,表进行优化。

克隆

sourceTableSize

源表的大小在字节版本的克隆。

sourceNumOfFiles

数量的文件在源表的克隆版。

numRemovedFiles

文件数量从目标表中删除如果表取代了先前的三角洲。

removedFilesSize

总大小的字节的文件删除目标表如果表取代了先前的三角洲。

numCopiedFiles

数量的文件复制到新的位置。0为浅克隆。

copiedFilesSize

总大小字节的文件复制到新的位置。0为浅克隆。

恢复

tableSizeAfterRestore

表大小的字节后恢复。

numOfFilesAfterRestore

表中数量的文件后恢复。

numRemovedFiles

恢复删除的文件操作的数量。

numRestoredFiles

被添加的文件数量的恢复。

removedFilesSize

大小的字节的文件被还原。

restoredFilesSize

大小字节的文件中添加的恢复。

真空

numDeletedFiles

删除文件的数量。

numVacuumedDirectories

真空的目录。

numFilesToDelete

要删除的文件数量。

三角洲湖时间旅行是什么?

三角洲湖时间旅行支持查询以前的表版本基于时间戳或表版本(在事务日志记录)。您可以使用时间旅行应用程序如以下:

  • 重新创建分析、报告、或输出(例如,机器学习模型)的输出。这对调试或审计可能是有用的,尤其是在监管的行业。

  • 编写复杂的时态查询。

  • 在您的数据修复错误。

  • 为一组提供快照隔离快速变化的表的查询。

重要的

表版本可以时间旅行是由一个事务日志文件保留阈值和指定的频率和保留真空操作。如果你运行真空日常使用默认值,可用的数据是7天时间旅行。

三角洲时间旅行的语法

你查询一个增量表时间旅行表名后增加一个条款规范。

  • timestamp_expression可以是任何一个:

    • 2018 - 10 - 18 t22:15:12.013z,也就是说,可以把一个字符串,该字符串转换为一个时间戳

    • 铸造(' 2018-10-1813:36:32c '作为时间戳)

    • “2018-10-18”,也就是说,一个日期字符串

    • current_timestamp ()- - - - - -时间间隔12小时

    • date_sub(当前日期(),1)

    • 其他表达式,也可以把一个时间戳

  • 版本是一个长期的价值,可以获得输出的吗描述历史table_spec

既不timestamp_expression也不版本子查询。

只接受日期或时间戳字符串。例如,“2019-01-01”“2019 - 01 - 01 t00:00:00.000z”。看下面的代码例如语法:

选择*people10m时间戳作为2018 - 10 - 18 t22:15:12.013z选择*δ' /tmp/δ/people10m版本作为123年
df1=火花选项(“timestampAsOf”,“2019-01-01”)(“people10m”)df2=火花选项(“versionAsOf”,123年)负载(“/ tmp /δ/ people10m”)

您还可以使用@语法来指定时间戳或版本的表名。必须在时间戳yyyyMMddHHmmssSSS格式。您可以指定一个版本@通过将一个v的版本。看下面的代码例如语法:

选择*people10m@20190101000000000选择*people10m@v123
火花(“people10m@20190101000000000”)火花(“people10m@v123”)火花负载(“/ tmp /δ/ people10m@20190101000000000”)火花负载(“/ tmp /δ/ people10m@v123”)

事务日志检查点是什么?

三角洲湖表版本为JSON文件中的记录_delta_log目录,这是存储在表的数据。优化查询、检查站三角洲湖总量表版本铺检查点文件,防止需要阅读所有的JSON版本表的历史。砖优化检查点频率数据的大小和工作负载。用户应该不需要直接与检查点。检查点频率可随时更改,不另行通知。

配置数据保留时间旅行的查询

查询之前的表格版本,你必须保留这两个的日志和数据文件的版本。

数据文件被删除时真空对一个表运行。三角洲湖管理日志文件删除后自动检查点表版本。

因为大多数三角洲表真空定期与他们,应该尊重保留阈值时间点查询真空默认情况下,这是7天。

为了增加数据保留阈值δ表,您必须配置以下表属性:

  • delta.logRetentionDuration=“间隔<时间>”:控制表的历史保存多久。默认值是时间间隔30.

  • delta.deletedFileRetentionDuration=“间隔<时间>”:确定阈值真空用来删除数据文件不再当前表中引用的版本。默认值是时间间隔7

您可以指定δ在表创建或设置它们的属性改变声明。看到三角洲表属性引用

请注意

您必须设置这两个属性,以确保表历史保留更长时间与频繁的表真空操作。例如,历史数据集的访问30天delta.deletedFileRetentionDuration=“间隔30.天”(匹配的默认设置delta.logRetentionDuration)。

增加存储数据保留阈值会导致成本上升,随着越来越多的数据文件。

恢复一个增量表的状态

请注意

在砖运行时7.4及以上。

你可以恢复一个增量表通过使用其先前的状态恢复命令。δ表内部维护历史版本的表,使它恢复到早期状态。之前版本对应状态或时间戳的早些时候的状态创建支持的选项恢复命令。

重要的

  • 你可以恢复已经恢复的表。

  • 你可以恢复克隆表。

  • 你必须有修改允许在桌子上被恢复。

  • 你不能一个表恢复到一个旧版本的数据文件被删除手动或通过真空。恢复这个版本部分仍然是可能的spark.sql.files.ignoreMissingFiles被设置为真正的

  • 时间戳格式恢复的状态yyyy-MM-ddHH: mm: ss。只提供一个日期(yyyy-MM-dd还支持)字符串。

恢复dbtarget_table版本作为<版本>恢复δ' /数据/目标/ '时间戳作为<时间戳>

语法细节,请参阅恢复

重要的

恢复是一个数据修改操作。三角洲湖日志条目的添加恢复命令包含dataChange设置为true。如果有一个下游应用程序,例如结构化流工作流程对三角洲湖表的更新,改变日志条目添加的数据恢复操作是新数据更新,可能会导致重复的数据和处理它们。

例如:

表版本

操作

三角洲日志更新

记录在数据更改日志更新

0

插入

AddFile(/路径/ /文件1,dataChange = true)

(name =维克多,= 29岁(name =乔治,年龄= 55)

1

插入

AddFile(/路径/ /文件2,dataChange = true)

(name =乔治,年龄= 39)

2

优化

AddFile(/路径/ / file-3 dataChange = false), RemoveFile(/道路/ /文件1)RemoveFile路径(/ / /文件2)

(没有记录作为优化压实不会改变表中的数据)

3

恢复(version = 1)

RemoveFile(/道路/ / file-3), AddFile(/路径/ /文件1,dataChange = true), AddFile(/路径/ /文件2,dataChange = true)

(name =维克多,年龄= 29),(name =乔治,年龄= 55),(name =乔治,年龄= 39)

在前面的例子中,恢复命令的结果更新已经看到当阅读三角洲表版本0和1。如果流媒体查询是阅读此表,那么这些文件将被视为新添加的数据和处理。

恢复指标

请注意

在砖运行时8.2及以上。

恢复报告以下指标作为一个单独的行DataFrame操作完成后:

  • table_size_after_restore:恢复后表的大小。

  • num_of_files_after_restore:表中的文件恢复后的数量。

  • num_removed_files:文件数量从表中删除(逻辑删除)。

  • num_restored_files:由于回滚文件数量恢复。

  • removed_files_size:总大小字节的文件从表中删除。

  • restored_files_size:总大小字节的文件恢复。

    恢复指标的例子

使用三角洲湖时间旅行的例子

  • 为用户解决意外删除一个表111年:

    插入my_table选择*my_table时间戳作为date_sub(当前日期(),1)在哪里用户标识=111年
  • 解决意外错误更新一个表:

    合并my_table目标使用my_table时间戳作为date_sub(当前日期(),1)用户标识=目标用户标识匹配然后更新*
  • 查询添加新客户的数量在过去的一周。

    选择(截然不同的用户标识)my_table- - - - - -(选择(截然不同的用户标识)my_table时间戳作为date_sub(当前日期(),7))

我怎么找到最后一个提交的版本火花会话吗?

得到最后的版本号提交当前写的SparkSession在所有线程和所有表、查询SQL配置spark.databricks.delta.lastCommitVersionInSession

火花δlastCommitVersionInSession
火花相依得到(“spark.databricks.delta.lastCommitVersionInSession”)
火花相依得到(“spark.databricks.delta.lastCommitVersionInSession”)

如果没有提交的SparkSession、查询返回一个空值的关键。

请注意

如果你共享相同的SparkSession在多个线程,它类似于跨多个线程共享变量;你可能打击竞态条件的并发更新配置值。