【发布时间】:2011-11-25 22:13:13
【问题描述】:
当从 HDFS 加载数据到 Hive 时,使用
LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;
命令,看起来它正在将 hdfs_file 移动到 hive/warehouse 目录。
是否可以(如何?)复制它而不是移动它,以便文件被另一个进程使用。
【问题讨论】:
当从 HDFS 加载数据到 Hive 时,使用
LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;
命令,看起来它正在将 hdfs_file 移动到 hive/warehouse 目录。
是否可以(如何?)复制它而不是移动它,以便文件被另一个进程使用。
【问题讨论】:
根据您的问题,我假设您已经将数据保存在 hdfs 中。
所以你不需要LOAD DATA,它将文件移动到默认的配置单元位置/user/hive/warehouse。您可以使用externalkeyword 简单地定义表,它将文件留在原处,但在 hive 元存储中创建表定义。看这里:
Create Table DDL
例如:
create external table table_name (
id int,
myfields string
)
location '/my/location/in/hdfs';
请注意,您使用的格式可能与默认格式不同(正如 jigneshRawal 在 cmets 中提到的那样)。您可以使用自己的分隔符,例如在使用 Sqoop 时:
row format delimited fields terminated by ','
【讨论】:
create table 时没有数据被移动,并且在仓库目录中的HDFS中创建了表。 AFAIK 给出 LOCATION 时,数据在 HDFS 内移动,但未使用 external 关键字。 (但我可能错了,请自己重新检查)
Sqoop 教程中使用的默认存储格式。您可以将其添加为额外的警告。
我发现,当您同时使用 EXTERNAL TABLE 和 LOCATION 时,Hive 会创建表并且最初不会显示任何数据(假设您的数据位置与 Hive 的“LOCATION”不同)。
当您使用“LOAD DATA INPATH”命令时,数据会从数据位置移动(而不是复制)到您在创建 Hive 表时指定的位置。
如果在创建 Hive 表时未指定位置,则它使用内部 Hive 仓库位置,数据将从您的源数据位置移动到内部 Hive 数据仓库位置(即 /user/hive/warehouse/)。
【讨论】:
可以使用“加载数据”的替代方法,其中数据不会从现有源位置移动到 Hive 数据仓库位置。
您可以使用带有“LOCATION”选项的 ALTER TABLE 命令。下面是所需的命令
ALTER TABLE table_name ADD PARTITION (date_col='2017-02-07') LOCATION 'hdfs/path/to/location/'
这里唯一的条件是,位置应该是目录而不是文件。
希望这能解决问题。
【讨论】: