0

我正在尝试清理和重新创建数据块增量表以进行集成测试。

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

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

此外,如果我只是从数据的增量表中删除,我仍然会看到底层的 dbfs 目录和完整的文件。如何优雅地清理 delta 和底层文件?

4

3 回答 3

0

确保您没有创建外部表。有两种类型的表:

1) 托管表

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

当您删除托管表时,spark 负责清理存储在元存储中的该表的元数据,并清理该表中存在的数据(文件)。

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

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

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

这将清除表文件夹中所有未提交的文件。我希望这可以帮助你。

于 2019-11-27T09:37:07.883 回答
0

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

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

如果您可以提供有关如何使用它的更多详细信息,那就更好了

于 2019-04-04T11:23:29.277 回答
0

完美的步骤如下:当您执行 aDROP TABLE并且DELETE FROM TABLE TABLE NAME以下事情发生时:

  • DROP TABLE:删除您的表,但数据仍然存在。(此外,您不能在同一位置创建具有模式更改的新表定义。)
  • DELETE FROM TABLE 从表中删除数据,但事务日志仍然存在。

所以,第 1 步 - DROP TABLE schema.Tablename

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

第 3 步 - % fs ls 确保该位置没有数据和事务日志

第 4 步:现在>!!!!!! RE_RUN 您的CREATE TABLE语句与您想要的任何更改UISNG delta location /mnt/path/where/your/table/definition/is/pointed/fileNames.parquet

第 5 步:开始使用表并使用 %sql 进行验证desc formatted schema.Tablename

于 2019-04-04T21:07:09.817 回答