【发布时间】:2019-12-11 09:59:12
【问题描述】:
当我运行drop database 命令时,spark 会删除数据库目录及其在 hdfs 上的所有子目录。我怎样才能避免这种情况?
【问题讨论】:
标签: apache-spark hive hdfs
当我运行drop database 命令时,spark 会删除数据库目录及其在 hdfs 上的所有子目录。我怎样才能避免这种情况?
【问题讨论】:
标签: apache-spark hive hdfs
除非您将数据库设置为仅包含存在于数据库 HDFS 目录之外的外部表,否则如果不将所有数据复制到 HDFS 中的另一个位置,则无法实现此目的。
来自以下网站: https://www.oreilly.com/library/view/programming-hive/9781449326944/ch04.html
默认情况下,Hive 不允许您删除包含表的数据库。您可以先删除表,也可以将 CASCADE 关键字附加到命令中,这将导致 Hive 先删除数据库中的表:
使用 RESTRICT 关键字代替 CASCADE 等效于默认行为,在删除数据库之前必须先删除现有表。
当一个数据库被删除时,它的目录也会被删除。
您可以在删除数据库之前将数据复制到另一个位置。我知道这很痛苦——但这就是 Hive 的运作方式。
如果您试图只删除一个表而不删除该表的 HDFS 目录,这里描述了一个解决方案:Can I change a table from internal to external in hive?
删除外部表会保留数据的 HDFS 位置。
在将数据库 drop 转换为外部后将数据库 drop 级联到表不会解决此问题,因为数据库 drop 会影响数据库所在的整个 HDFS 目录。您仍然需要将数据复制到另一个位置。
如果您从头开始创建数据库,其中的每个表都是外部的并且引用数据库 HDFS 目录之外的位置,删除此数据库将保留数据。但是,如果您将其设置为数据当前位于数据库 HDFS 目录中,则您将没有此功能;这是你必须从头开始设置的东西。
【讨论】: