【问题标题】:What is the best way to cleanup and recreate databricks delta table?清理和重新创建数据块增量表的最佳方法是什么?
【发布时间】:2019-08-26 01:46:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你试过drop table了吗?
  • @Gladiator 是的,它只是删除了表格,但底层的 parquet 文件不会被删除。因此,下次您创建表并插入数据然后进行选择时,您会看到重复项
  • overwrite模式写入新表

标签: databricks azure-databricks delta-lake


【解决方案1】:

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

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

如果你能提供更多关于你如何使用它的细节,那就更好了

【讨论】:

    【解决方案2】:

    完美的步骤如下: 当您执行DROP TABLEDELETE 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 步:现在>!!!!!!重新运行您的 CREATE TABLE 语句并进行任何您想要的更改 UISNG delta location /mnt/path/where/your/table/definition/is/pointed/fileNames.parquet

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

    【讨论】:

      【解决方案3】:

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

      1) 托管表

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 2018-08-30
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多