清理和重新创建数据块增量表的最佳方法是什么?

时间:2019-04-04 10:28:07

标签: databricks azure-databricks delta-lake

我正在尝试清理并重新创建用于集成测试的databricks增量表。

我想在devops代理上运行测试,因此我正在使用JDBC(Simba驱动程序),但是它说不支持语句类型“ DELETE”。

当我使用DBFS API“ rm -r”清理基础DBFS位置时,它清理了表,但是重新创建后的下一次读取给出了错误-找不到事务日志中引用的文件。当已经从文件系统中手动删除数据而不是使用表DELETE语句时,就会发生这种情况。

如果我只是简单地从delta表中删除数据,我仍然会看到基础的dbfs目录和完整的文件。如何优雅地清理增量以及基础文件?

3 个答案:

答案 0 :(得分:0)

您可以使用VACUUM命令进行清理。我还没用过。

如果使用的是spark,则可以使用overwriteSchema选项重新加载数据。

如果您可以提供有关其使用方式的更多详细信息,那会更好

答案 1 :(得分:0)

完美的步骤如下: 当您执行DROP TABLEDELETE FROM TABLE TABLE NAME时,以下情况会发生:

  • DROP TABLE :删除表,但数据仍然存在。(此外,您无法在同一位置更改架构来创建新的表定义。)
  • 从表中删除从表中删除数据,但事务日志仍驻留。

因此,第1步-DROP TABLE模式。表名

STEP 2-%fs rm -r /mnt/path/where/your/table/definition/is/pointed/fileNames.parquet

步骤3-%fs ls确保该位置没有数据,也没有事务日志

第4步:现在> !!!!使用您希望的任何更改{_1}} UISNG delta location

重新运行您的 CREATE TABLE 语句

第5步:开始使用表格并使用%sql /mnt/path/where/your/table/definition/is/pointed/fileNames.parquet desc formatted

进行验证

答案 2 :(得分:0)

确保不创建外部表。表格有两种:

1)托管表

2)外部表(已指定数据集的位置)

删除托管表时,spark负责清理存储在metastore中的该表的metaData以及清理该表中存在的数据(文件)。

但是对于外部表,spark不拥有数据,因此,在删除外部表时,spark中仅删除metastore中存在的元数据,并且该表中存在的数据(文件)不会获得 已删除

此后,如果您确认表是托管表并且仍在删除的表没有删除文件,则可以使用VACUUM命令:

VACUUM <databaseName>.<TableName> [RETAIN NUM HOURS]

这将从表的文件夹中清除所有未提交的文件。 希望对您有帮助。