Hive外部表与内部表命令

时间:2018-02-02 05:35:32

标签: hadoop hive

假设我有这两个表:

外部

create external table emp_feedback (
  emp_id int,
  emp_name string
)
LOCATION '/user/hive/warehouse/mydb.db/contacts';

内部

create table emp_feedback (
  emp_id int,
  emp_name string
)
LOAD DATA INPATH 'file_location_of_csv' INTO TABLE emp_feedback;
  1. 当我说:外部表的LOCATION '/user/hive/warehouse/mydb.db/contacts';表示该表的数据是否在目录'/user/hive/warehouse/mydb.db/contacts';中找到?那么该目录必须先存在于HDFS中吗?
  2. 我可以将LOAD DATA INPATH...用于external表,还是仅用于internal表。反之亦然,我可以使用Location...作为内部表吗?

2 个答案:

答案 0 :(得分:2)

  1. (a)是的。你是对的,这意味着数据可以在那个位置/目录中找到
  2. (b)否。目录不必存在以创建模式,如果目录不存在,Hive将创建目录。但是没有意义,因为您的表将为空,因此您的查询将为空。但是将来,您可以将数据移动到该位置并使用该表。

  3. (a)LOAD DATA INPATH可用于外部和内部表。执行此操作时,它会将数据移动到架构指定的位置(对于外部表)或/.../warehouse/...(对于内部表)

  4. (b)可以为内部和外部表指定location。但是当您删除内部表时,它也会从该位置删除数据,而只删除外部表的元数据信息。

答案 1 :(得分:1)

加载数据inpath 命令用于将数据加载到hive表中。 ' LOCAL'表示输入文件位于本地文件系统上。如果' LOCAL'省略,然后它在HDFS中查找文件。

load data inpath '/path/file.csv' into mytable; 
load data local inpath '/Local path/file.csv' into mytable;

此命令将删除源目录中的内容并创建内部表

LOCATION 关键字允许指向其存储的任何HDFS位置,而不是存储在配置属性hive.metastore.warehouse.dir指定的文件夹中。

换句话说,使用指定的LOCATION' /您的路径/',Hive不会使用此表的默认位置。如果您已经生成了数据,这会派上用场。

请记住,LOCATION只能在EXTERNAL表上指定。对于常规表,将使用默认位置。 创建外部表并将数据复制到表中。现在数据不会从源头移动。您可以删除外部表,但仍然可以获得源数据。

当您删除外部表时,它只会删除HIVE表的元数据。数据仍存在于HDFS文件位置。

总结一下,在路径中加载数据告诉hive在哪里查找输入文件,LOCATION关键字告诉hive在HDFS上保存输出文件的位置。