工作与三角洲湖表的历史
每个操作,修改一个三角洲湖表创建一个新的表版本。您可以使用历史信息审核操作,回滚表或查询一个表在一个特定时间点上使用时间旅行。
请注意
砖不建议使用三角洲湖表作为一个长期的历史数据归档备份解决方案。砖建议只使用过去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
还支持)字符串。
恢复表db。target_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
在多个线程,它类似于跨多个线程共享变量;你可能打击竞态条件的并发更新配置值。