假设我有这两个表:
外部:
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;
LOCATION '/user/hive/warehouse/mydb.db/contacts';
表示该表的数据是否在目录'/user/hive/warehouse/mydb.db/contacts';
中找到?那么该目录必须先存在于HDFS中吗?LOAD DATA INPATH...
用于external
表,还是仅用于internal
表。反之亦然,我可以使用Location...
作为内部表吗?答案 0 :(得分:2)
(b)否。目录不必存在以创建模式,如果目录不存在,Hive将创建目录。但是没有意义,因为您的表将为空,因此您的查询将为空。但是将来,您可以将数据移动到该位置并使用该表。
(a)LOAD DATA INPATH
可用于外部和内部表。执行此操作时,它会将数据移动到架构指定的位置(对于外部表)或/.../warehouse/...
(对于内部表)
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上保存输出文件的位置。