11

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

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

编辑:我通过以下命令加载它

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

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

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

我以为是抄的。

4

4 回答 4

15

使用外部表:

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 目录..

如果您删除外部表配置单元将不会删除源数据。如果管理原始文件,请使用外部表。如果你想让 hive 这样做,让 hive 存储在它的仓库路径内。

于 2013-03-07T22:48:59.143 回答
4

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

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

注意LOCAL

于 2013-03-07T13:34:10.090 回答
1

您可以使用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/';
于 2014-03-04T11:16:54.507 回答
0

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

于 2014-04-23T12:43:08.927 回答