Hadoop 配置单元托管表与外部表:位置目录

Hadoop 配置单元托管表与外部表:位置目录,hadoop,hive,Hadoop,Hive,我一直在看一些蜂巢书籍和教程。其中一本书——《Hadoop在实践中》说 当您创建 外部(非托管)表,配置单元将数据保留在 位置关键字保持不变。但是如果要执行相同的CREATE命令 并删除EXTERNAL关键字,该表将是一个托管表, 而配置单元会将位置目录的内容移动到/user/Hive中/ 仓库/库存,这可能不是您期望的行为 我用LOCATION关键字创建了一个托管表。然后从HDFS文件将数据加载到表中。但我看不到在/user/hive/warehouse下创建的任何目录。相反,新目录是在前面提

我一直在看一些蜂巢书籍和教程。其中一本书——《Hadoop在实践中》说

当您创建 外部(非托管)表,配置单元将数据保留在 位置关键字保持不变。但是如果要执行相同的CREATE命令 并删除EXTERNAL关键字,该表将是一个托管表, 而配置单元会将位置目录的内容移动到/user/Hive中/ 仓库/库存,这可能不是您期望的行为

我用LOCATION关键字创建了一个托管表。然后从HDFS文件将数据加载到表中。但我看不到在/user/hive/warehouse下创建的任何目录。相反,新目录是在前面提到的位置创建的。所以我认为,如果我创建一个包含提到的位置的托管表,那么在Hive warehouse目录中没有创建任何内容?这种理解正确吗


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

当您使用location关键字创建表时,它会将表指向该位置。该位置以hdfs格式指定数据文件的路径

CREATE EXTERNAL TABLE IF NOT EXISTS mydb.contacts (
  name         STRING ,
  -- ... other variables
  city         STRING ,
LOCATION '/user/hive/warehouse/mydb.db/contacts';
在指定位置时,必须确保将数据文件放置在该位置。在上面的示例中,我们显式地告诉配置单元数据在外部表中的位置。如果我们没有指定一个表,那么默认位置如下所示,这对于没有location语句的任何表都是正确的,除非您的系统管理员更改默认位置

/user/hive/warehouse/databasename.db/contacts
在这两种情况下(托管或外部)位置都是可选的,因此无论您创建哪个表(托管或外部),只要您指定位置,数据都将存储在相同的HDFC位置路径上。
而且,如果您不使用位置,则会考虑hive-site.xml中提到的默认位置路径

首先,当您使用
位置
关键字创建
托管表
时,它不会在指定的
位置
创建目录,而是会给您一个异常:
失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。元异常(消息:hdfs://path/of/the/given/location 不是目录或无法创建目录)

这意味着在DDL中,您给定的
位置
首先需要存在目录,否则将抛出上述给定的异常。
接下来,您可以使用给定的
位置创建DDL。
接下来,您可以使用
select*from
命令查看数据(无需加载数据)。
但是当您删除此表时,您的数据也会从hdfs中消失(与外部表不同),元数据也会消失。
这是具有
location
关键字的托管表之间的主要区别。它的行为部分类似于外部表,部分类似于托管表。
外部,如中,您不必加载数据,只需指定位置。
管理,如中所示,您删除表时,数据也会被删除。

希望这是有意义的。

托管表和非托管表 每个Spark SQL表都有存储模式和数据本身的元数据信息

托管表是Spark SQL表,Spark为其管理数据和元数据。在托管表的情况下,Databricks将元数据和数据存储在您的帐户中的DBFS中。由于Spark SQL管理表,因此执行DROP TABLE example_data会删除元数据和数据

创建托管表的一些常见方法有:

CREATE TABLE <example-table>(id STRING, value STRING)
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")
创建表(id字符串、值字符串)
另一种选择是让Spark SQL管理元数据,同时控制数据位置。我们将其称为非托管表。Spark SQL管理相关元数据,因此在执行DROP TABLE时,Spark只删除元数据,而不删除数据本身。数据仍然存在于您提供的路径中

您可以使用数据源(如Cassandra、JDBC表等)中的数据创建非托管表。有关DataRicks支持的数据源的更多信息,请参见数据源。创建非托管表的一些常见方法有:

CREATE TABLE <example-table>(id STRING, value STRING)
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")
使用org.apache.spark.sql.parquet选项(路径“”)创建表(id字符串、值字符串)