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

时间:2011-09-27 10:23:32

标签: hadoop hive

使用

将数据从HDFS加载到Hive时
LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;

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

3 个答案:

答案 0 :(得分:82)

从您的问题

我假设您已经拥有hdfs中的数据。 因此,您不需要LOAD DATA,这会将文件移动到默认的配置单元位置/user/hive/warehouse。您可以使用external关键字定义表,该关键字保留文件,但在hive Metastore中创建表定义。看这里: Create Table DDL 例如:

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

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

row format delimited fields terminated by ','

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

“负载数据”的替代方案'可用于将数据从现有源位置移动到配置单元数据仓库位置。

你可以使用ALTER TABLE命令和' LOCATION'选项。这是下面所需的命令

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

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

希望这能解决问题。