我登录存储在HDFS的文本文件。 当我在日志文件加载到蜂巢表,所有的文件都复制。
我可以避免存储两次我所有的文本数据?
编辑:我通过以下命令加载它
LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221')
然后,我可以找到完全相同的文件:
/user/hive/warehouse/sandbox.db/test/day=20130220
我以为它被复制。
使用外部表:
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目录..
如果你把一个外部表蜂巢不会删除源数据。 如果你想管理你的原始文件,使用外部表。 如果你想蜂巢做吧,让蜂巢店其仓库路径内。
我可以说,而不是由你的Java应用程序直接向HDFS复制数据,在本地文件系统中的文件,并使用以下命令他们通过蜂巢导入到HDFS。
LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221')
注意LOCAL
您可以使用ALTER TABLE语句的分区,以避免数据重复。
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/';
蜂巢(在真正的集群模式下运行ATLEAST时)不能指在本地文件系统中的外部文件。 蜂房表创建或加载操作过程中自动导入文件。 这背后的原因可能是配置单元运行MapReduce作业内部提取数据。 MapReduce的从HDFS读取和写回HDFS,甚至在分布式模式下运行。 因此,如果文件存储在本地文件系统,它不能由分布式基础架构上使用。