当前位置: 首页 > 知识库问答 >
问题:

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

谷梁晟
2023-03-14

我正试图清理并重新创建用于集成测试的数据块增量表。

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

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

此外,如果我只是对数据从增量表中执行DELETE,我仍然可以看到底层dbfs目录和文件完好无损。如何优雅地清理增量和底层文件?

共有3个答案

慎俊艾
2023-03-14

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

1) 托管表

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

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

但对于外部表,spark并不拥有数据,所以当您删除外部表时,只有元存储中存在的元数据会被spark删除,而该表中存在的数据(文件)不会被删除。

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

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

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

段干浩荡
2023-03-14

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

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

因此,步骤 1 - 删除表架构。表名

第 2 步 - %fs rm -r /mnt/路径/位置/您的/表/定义/是/指向/文件名.parquet

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

第4步:现在

步骤5:开始使用该表,并使用%sql desc 格式化 模式进行验证。表名

蒋俊
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我已经看到了许多不同的方法来创建和填充数字表。但是,创建和填充一个的最佳方法是什么?从“最重要”到“最不重要”定义“最佳”: 用最佳索引创建的表 产生最快的行 用于创建和填充的简单代码 问题答案: 这是一些从网上获取的代码示例,以及对该问题的解答。 对于每种方法,我都修改了原始代码,因此每种方法都使用相同的表和列:NumbersTest和Number,具有10,000行或尽可能接近的行

  • 问题内容: 我的任务是维护一个最近遭受SQL注入攻击的受害者的非营利性网站。有人利用站点上的表单将文本添加到数据库中每个可用的类似文本的字段(varchar,nvarchar等)中,当将其呈现为HTML时,该字段将包含并执行JavaScript文件。 Google对URL的搜索表明它来自罗马尼亚或中国以外的垃圾邮件发送者,但是现在这并不重要。 我仔细检查并手动从显示在网站上最可见和最受欢迎的页面上

  • null 另外,如果使用,是否需要导入文件,或者不导入文件,常量将全局可用? 我可以从逻辑上得出一个结论,即是定义自定义错误域之类的东西时的最佳选择(我真的对吗?)。但其他人呢?

  • 问题内容: 我有一个带有递归parent_id的自引用MySQL表: 在测试期间,我想清空它,但TRUNCATE失败: 我目前必须手动删除所有记录,从树的底部开始向上操作。即使是小树,这也很繁重。 有没有解决此问题的简单方法?我无法在表中轻松地重新创建该表,因为其他表已对其进行引用(我已经将其截断了,所以那里应该没有数据完整性问题)。 问题答案: 为什么不: ?

  • 问题内容: 我想使用JavaScript 重新加载。到目前为止,我发现的最好方法是将iframe的属性设置为其自身,但这并不是很干净。有任何想法吗? 问题答案: 注意,在Firefox中,不能通过id进行索引,而只能通过名称或索引进行索引