我正在尝试清理并重新创建用于集成测试的databricks增量表。
我想在devops代理上运行测试,因此我正在使用JDBC(Simba驱动程序),但是它说不支持语句类型“ DELETE”。
当我使用DBFS API“ rm -r”清理基础DBFS位置时,它清理了表,但是重新创建后的下一次读取给出了错误-找不到事务日志中引用的文件。当已经从文件系统中手动删除数据而不是使用表DELETE
语句时,就会发生这种情况。
如果我只是简单地从delta表中删除数据,我仍然会看到基础的dbfs目录和完整的文件。如何优雅地清理增量以及基础文件?
答案 0 :(得分:0)
您可以使用VACUUM命令进行清理。我还没用过。
如果使用的是spark,则可以使用overwriteSchema选项重新加载数据。
如果您可以提供有关其使用方式的更多详细信息,那会更好
答案 1 :(得分:0)
完美的步骤如下:
当您执行DROP TABLE
和DELETE FROM TABLE TABLE NAME
时,以下情况会发生:
因此,第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
第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]
这将从表的文件夹中清除所有未提交的文件。 希望对您有帮助。