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

Sug*_*uge 46 hadoop hive

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

LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;
Run Code Online (Sandbox Code Playgroud)

命令,看起来它正在将hdfs_file移动到hive/warehousedir.是否有可能(如何?)复制它而不是按顺序移动它,以便文件被另一个进程使用.

Dag*_*Dag 83

从你的问题我假设你已经在hdfs中有你的数据.因此您不需要LOAD DATA将文件移动到默认的配置单元位置/user/hive/warehouse.您可以使用external关键字定义表,该关键字保留文件,但在hive Metastore中创建表定义.请参阅此处: 创建表DDL 例如:

create external table table_name (
  id int,
  myfields string
)
location '/my/location/in/hdfs';
Run Code Online (Sandbox Code Playgroud)

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

row format delimited fields terminated by ','
Run Code Online (Sandbox Code Playgroud)

  • @Dag我尝试使用关键字'EXTERNAL'创建表的上述方法,但是它第一次创建了所有值为NULL的表.创建表模式时,需要添加以下行.由','终止的行格式删除字段.如果我错了,请纠正我. (5认同)

Avi*_*ash 5

我发现,当您同时使用EXTERNAL TABLE和LOCATION时,Hive会创建表格并且最初不会出现任何数据(假设您的数据位置与Hive'LOCATION'不同).

当您使用'LOAD DATA INPATH'命令时,数据从数据位置MOVED(而不是复制)到您在创建Hive表时指定的位置.

如果在创建Hive表时未给出位置,则它将使用内部Hive仓库位置,并且数据将从源数据位置移动到内部Hive数据仓库位置(即/ user/hive/warehouse /).