Hive托管表与外部表:LOCATION目录

时间:2015-07-09 07:15:53

标签: hadoop hive

我一直在阅读一些HIVE书籍和教程。其中一本书 - 实践中的Hadoop说

  

创建时   外部(非托管)表,Hive将数据保存在指定的目录中   LOCATION关键字完好无损。但是如果你要执行相同的CREATE命令   并删除EXTERNAL关键字,该表将是一个托管表,   和Hive会将LOCATION目录的内容移动到/ user / hive /   仓库/库存,这可能不是您期望的行为。

我使用LOCATION关键字创建了一个托管表。然后从HDFS文件将数据加载到表中。但我看不到在/ user / hive / warehouse下创建的任何目录。而是在提到的LOCATION中创建了新目录。所以我想如果我创建一个带有LOCATION的MANAGED表,那么在Hive仓库目录中什么都没有创建?这种理解是否正确?

另外,如果LOAD命令期间输入文件的位置是hdfs,那么内部或外部表都会将数据移动到它们的位置。这种理解也是正确的吗?

4 个答案:

答案 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>")