在hive中`load data inpath`和`location`之间的区别?

Hun*_*nle 7 sql hadoop hive hdfs hiveql

在我的公司,我看到经常使用这两个命令,我想知道它们之间的差异,因为它们的功能对我来说似乎是一样的:

1

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

load data inpath '/directory-path/file.csv' into <mytable>; 
Run Code Online (Sandbox Code Playgroud)

2

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

location '/directory-path/file.csv';
Run Code Online (Sandbox Code Playgroud)

它们都将数据从HDFS上的目录复制到HIVE上的表目录中.使用这些产品时是否应该注意哪些差异?谢谢.

小智 10

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

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>;
Run Code Online (Sandbox Code Playgroud)

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

换句话说,在指定LOCATION '/your-path/'的情况下,Hive不会为此表使用默认位置.如果您已经生成了数据,这会派上用场.

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

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

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


Rav*_*abu 7

选项 1:内部表

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

load data inpath '/directory-path/file.csv' into <mytable>; 
Run Code Online (Sandbox Code Playgroud)

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

选项 2:外部表

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

location '/directory-path/file.csv';
Run Code Online (Sandbox Code Playgroud)

创建外部表并将数据复制到 table 中。现在数据不会从源移动。您可以删除外部表,但源数据仍然可用。

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

查看有关内部和外部表用例的相关 SE 问题

Hive 内部表和外部表的区别?