我一直在阅读一些HIVE书籍和教程。其中一本书 - 实践中的Hadoop说
创建时 外部(非托管)表,Hive将数据保存在指定的目录中 LOCATION关键字完好无损。但是如果你要执行相同的CREATE命令 并删除EXTERNAL关键字,该表将是一个托管表, 和Hive会将LOCATION目录的内容移动到/ user / hive / 仓库/库存,这可能不是您期望的行为。
我使用LOCATION关键字创建了一个托管表。然后从HDFS文件将数据加载到表中。但我看不到在/ user / hive / warehouse下创建的任何目录。而是在提到的LOCATION中创建了新目录。所以我想如果我创建一个带有LOCATION的MANAGED表,那么在Hive仓库目录中什么都没有创建?这种理解是否正确?
另外,如果LOAD命令期间输入文件的位置是hdfs,那么内部或外部表都会将数据移动到它们的位置。这种理解也是正确的吗?
答案 0 :(得分:1)
在这两种情况下(托管或外部)位置是可选的,因此无论何时指定LOCATION数据都将存储在相同的HDFC位置路径上,无论您创建哪个表(托管或外部)。 并且,如果您不使用LOCATION,则会考虑hive-site.xml中提到的默认位置路径。
答案 1 :(得分:0)
使用location关键字创建表时,它会将表指向该位置。该位置指定hdfs中数据文件的路径。
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.contacts (
name STRING ,
-- ... other variables
city STRING ,
LOCATION '/user/hive/warehouse/mydb.db/contacts';
当您指定位置时,您必须确保将数据文件放在那里。在上面的例子中,我们明确地告诉hive数据在外部表中的位置。如果我们没有指定一个表,则默认位置如下所示,对于没有位置语句生成的任何表都是如此,除非您的系统管理员更改了默认位置。
/user/hive/warehouse/databasename.db/contacts
答案 2 :(得分:0)
首先,当您使用managed table
关键字创建location
时,它不会在指定的location
创建目录,而是会给您一个例外:{{1} }。
这意味着在DDL中,您提供的FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:hdfs://path/of/the/given/location is not a directory or unable to create one)
首先需要存在该目录,否则将抛出上面给出的异常。
接下来,您可以使用location
创建DDL
接下来,您可以使用location
命令查看数据(无需加载数据)
但是当您删除此表时,您的数据也会从hdfs中消失(与外部表不同),并且元数据也消失了
这是托管表与select * from <table>
关键字之间的主要区别。它的行为部分类似于外部表,部分类似于托管表
外部,例如,您不必加载数据,只需指定位置即可
管理,如同删除表格一样,数据也会被删除
希望这是有道理的。
答案 3 :(得分:0)
托管和非托管表 每个 Spark SQL 表都包含存储架构和数据本身的元数据信息。
托管表是 Spark SQL 表,Spark 为其管理数据和元数据。对于托管表,Databricks 将元数据和数据存储在您帐户中的 DBFS 中。由于 Spark SQL 管理表,因此执行 DROP TABLE example_data 会删除元数据和数据。
创建托管表的一些常见方法是:
CREATE TABLE <example-table>(id STRING, value STRING)
另一种选择是让 Spark SQL 管理元数据,同时您控制数据位置。我们将其称为非托管表。 Spark SQL 管理相关的元数据,所以当你执行 DROP TABLE 时,Spark 只删除元数据而不是数据本身。数据仍然存在于您提供的路径中。
您可以使用 Cassandra、JDBC 表等数据源中的数据创建非托管表。有关 Databricks 支持的数据源的更多信息,请参阅数据源。创建非托管表的一些常见方法是:
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")