如何将数据从HDFS加载到Hive而不删除源文件?

57

当从HDFS加载数据到Hive时,使用

LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;

这个命令似乎是将hdfs_file移动到hive/warehouse目录中。 是否可能(如何?)将它复制而不是移动,以便文件可以被另一个进程使用。

3个回答

91

根据你的问题,我认为你已经在HDFS中有了数据。 因此,你不需要使用LOAD DATA将文件移动到默认的Hive位置/user/hive/warehouse。你可以使用external关键字来定义表,这样可以将文件保留在原地,但是在Hive元存储中创建表的定义。详见: 创建表DDL 例如:

create external table table_name (
  id int,
  myfields string
)
location '/my/location/in/hdfs';
请注意,您使用的格式可能与默认格式不同(正如JigneshRawal在评论中提到的那样)。例如,在使用Sqoop时,您可以使用自己的分隔符:
row format delimited fields terminated by ','

DAG,我有一个关于这个问题的疑问。当使用“Create Table”命令创建Hive表时,文件会从HDFS位置移动到“/User/Hive/warehouse/Table/”。这个新位置也位于HDFS上吗?还是只是本地目录?我认为它应该也是HDFS位置,对吗? - Ragav
6
我尝试了使用关键字“EXTERNAL”创建表格的方法,但第一次创建时它创建了一个所有值都为NULL的表格。在创建表结构时需要添加以下行:ROW FORMAT DELIMITED FIELDS TERMINATED BY ','。如果我有错误请纠正我。 - Jignesh Rawal
@JigneshRawal 这是一个非常特定的情况,不应该应用于Dag的解决方案。您也不应该在模式创建中使用该语句,而应该在表的创建中使用,无论是外部的还是托管的。 - mlegge
1
@Dag,我认为你应该考虑加入Jignesh提到的内容,因为这似乎是许多“Sqoop”教程中使用的默认存储格式。你可以将其作为额外的注意事项添加进去。 - Brian
@BrianVanover 感谢您的建议 +1,我已经在答案中添加了一条注释。 - Dag
显示剩余2条评论

5
我发现,当你在使用EXTERNAL TABLE和LOCATION的时候,Hive会创建表格但最初没有数据(假设你的数据位置不同于Hive的'LOCATION')。使用“LOAD DATA INPATH”命令时,数据会被移动(而不是复制)从数据位置到指定的Hive表格创建位置。如果创建Hive表格时没有提供位置信息,它将使用内部Hive仓库位置,并且数据将从源数据位置移动到内部Hive数据仓库位置(即/user/hive/warehouse/)。

4

有一种替代'LOAD DATA'的方法,数据不会从现有源位置移动到Hive数据仓库位置。

您可以使用带有'LOCATION'选项的ALTER TABLE命令。下面是所需的命令:

ALTER TABLE table_name ADD PARTITION (date_col='2017-02-07') LOCATION 'hdfs/path/to/location/'

唯一的条件是,该位置应该是一个目录而不是文件。
希望这能解决问题。

只有在创建的表是外部表时,此方法才有效。 - Jai Prakash

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