`load data inpath` 和 `location` 在Hive中有什么区别?

14

在我们公司中,我经常看到这两个命令被使用,而且我想了解它们之间的区别,因为它们的功能对我来说似乎是相同的:

1

create table <mytable> 
(name string,
number double);

load data inpath '/directory-path/file.csv' into <mytable>; 

2

create table <mytable>
(name string,
number double);

location '/directory-path/file.csv';

它们都将数据从HDFS目录复制到HIVE表的目录中。在使用它们时,有什么区别需要注意吗?谢谢。


1
我认为对于你的第二个查询,location '/directory-path/file.csv'; 将不起作用,因为您正在创建一个内部表(因为您没有明确指定 create external table,而只是简单地说 create table <mytable> (name string, number double);)。因此,您无法在该内部表上使用位置,因为内部表的位置已经由配置属性 hive.metastore.warehouse.dir 设置,并且您不能使用 location 关键字更改它。 - user5228393
2个回答

20

是的,它们完全用于不同的目的。

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

load data inpath '/directory-path/file.csv' into <mytable>; 
load data local inpath '/local-directory-path/file.csv' into <mytable>;

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

换句话说,使用指定的LOCATION '/your-path/',Hive不会为此表使用默认位置。如果您已经生成了数据,则这非常方便。

请记住,只能在EXTERNAL表上指定LOCATION。对于常规表,将使用默认位置。

总结一下, load data inpath告诉Hive在哪里查找输入文件,LOCATION关键字告诉Hive在HDFS上保存输出文件的位置。

参考文献: https://cwiki.apache.org/confluence/display/Hive/GettingStarted https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL


1
能否将目录传递给 load data inpath 命令?我注意到你只能传递文件名。 - makansij
你提供的两个命令中都缺少TABLE关键字。应该像这样:load data inpath '/directory-path/file.csv' into TABLE <mytable> - JenkinsY

8

选项1:内部表

create table <mytable> 
(name string,
number double);

load data inpath '/directory-path/file.csv' into <mytable>; 

该命令将删除源目录中的内容并创建内部表。
选项2:外部表。
 create table <mytable>
 (name string,
 number double);

location '/directory-path/file.csv';

创建外部表并将数据复制到表中。现在数据不会从源移动。您可以删除外部表,但仍然可以访问源数据。
当您删除外部表时,它只会删除HIVE表的元数据。数据仍然存在于HDFS文件位置。
查看此相关SE问题,了解内部和外部表的用例。 Hive内部表和外部表之间的区别?

1
啊哈,谢谢!我现在有更好的理解了。那么,你是指定一个目录还是一个文件作为location?我看到你有文件路径,但我也见过目录。 - makansij
1
其次,在“选项2”中您没有使用关键字external。当您使用单词“location”时,是否暗示了外部表? - makansij
我目前只使用了文件,对于目录不确定。如果允许使用目录,则所有文件中的行应该保持相同的格式。该位置仅适用于外部表。 - Ravindra babu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接