hadoop—是否可以将数据导入配置单元表而不复制数据

yh2wf1be  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(344)

我的日志文件以文本形式存储在hdfs中。当我将日志文件加载到配置单元表中时,所有文件都会被复制。
我能避免所有文本数据存储两次吗?
编辑:我通过以下命令加载它

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

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

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

我以为是抄袭的。

wbrvyc0a

wbrvyc0a1#

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

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

注意 LOCAL

thtygnil

thtygnil2#

使用外部表:

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存储在其仓库路径中。

jk9hmnmh

jk9hmnmh3#

您可以使用ALTERTABLEPARTITION语句来避免数据重复。

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/';
bd1hkmkf

bd1hkmkf4#

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

相关问题