如何在不删除源文件的情况下将数据从HDFS加载到configuration单元?

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

LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename; 

命令,它看起来像是将hdfs_file移动到hive/warehouse目录。 是否有可能(如何?)复制它,而不是移动它,为了该文件,由另一个进程使用。

从你的问题我假设你已经有你的数据hdfs。 所以你不需要LOAD DATA ,这会将文件移动到默认的configuration单元位置/user/hive/warehouse 。 您可以简单地使用external关键字来定义表格,该关键字会保留文件,但会在configuration单元Metastore中创build表格定义。 看到这里: 创build表DDL例如:

 create external table table_name ( id int, myfields string ) location '/my/location/in/hdfs'; 

请注意,您使用的格式可能与默认值不同(正如JigneshRawal在评论中提到的)。 您可以使用自己的分隔符,例如使用Sqoop时:

 row format delimited fields terminated by ',' 

我发现,当你使用EXTERNAL TABLE和LOCATION时,Hive会创build表格,最初没有数据会呈现(假设你的数据位置与Hive的LOCATION不同)。

当您使用“LOAD DATA INPATH”命令时,数据从数据位置到创buildHive表时指定的位置获取MOVED(而不是复制)。

如果在创buildHive表时未指定位置,则会使用内部Hive仓库位置,数据将从源数据位置移至内部Hive数据仓库位置(即/ user / hive / warehouse /)。

“LOAD DATA”的替代方法是可用的,其中数据不会从您现有的源位置移动到configuration单元数据仓库位置。

你可以用'LOCATION'选项来使用ALTER TABLE命令。 以下是需要的命令

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

这里唯一的条件是,该位置应该是一个目录而不是文件。

希望这将解决这个问题。