是否可以在不复制数据的情况下将数据导入Hive表

时间:2013-03-07 12:18:00

标签: hadoop hive hdfs

我将日志文件存储为HDFS中的文本。当我将日志文件加载到Hive表中时,会复制所有文件。

我可以避免将所有文本数据存储两次吗?

编辑:我通过以下命令

加载它
LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221')

然后,我可以找到完全相同的文件:

/user/hive/warehouse/sandbox.db/test/day=20130220

我以为它被复制了。

4 个答案:

答案 0 :(得分:14)

使用外部表:

CREATE EXTERNAL TABLE sandbox.test(id BIGINT, name STRING) ROW FORMAT
              DELIMITED FIELDS TERMINATED BY ','
              LINES TERMINATED BY '\n' 
              STORED AS TEXTFILE
              LOCATION '/user/logs/';

如果要使用外部表进行分区,则需要负责管理分区目录。 指定的位置必须是hdfs目录..

如果删除外部表配置单元,则不会删除源数据。 如果想要管理原始文件,请使用外部表。如果您希望配置单元执行此操作,请将配置单元存储在其仓库路径中。

答案 1 :(得分:3)

我可以说,不是将java应用程序的数据直接复制到HDFS,而是将这些文件放在本地文件系统中,然后使用以下命令通过hive将它们导入HDFS。

LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221')

注意LOCAL

答案 2 :(得分:0)

您可以使用alter table partition语句来避免数据重复。

create External table if not exists TestTable (testcol string) PARTITIONED BY (year INT,month INT,day INT) row format delimited fields terminated by ',';

ALTER table TestTable partition (year='2014',month='2',day='17') location 'hdfs://localhost:8020/data/2014/2/17/';

答案 3 :(得分:0)

Hive(在真正的群集模式下运行时至少)无法引用本地文件系统中的外部文件。 Hive可以在表创建或加载操作期间自动导入文件。这背后的原因可能是Hive在内部运行MapReduce作业以提取数据。 MapReduce从HDFS读取以及写回HDFS甚至以分布式模式运行。因此,如果文件存储在本地文件系统中,则分布式基础结构不能使用它。