【问题标题】:Is it possible to import data into Hive table without copying the data是否可以在不复制数据的情况下将数据导入 Hive 表
【发布时间】:2013-02-22 15:26:59
【问题描述】:

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

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

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

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

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

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

我以为是抄袭的。

【问题讨论】:

  • 怎么说,抄袭了?如何将它们加载到 hive 表中?
  • 我通过LOAD DATA INPATH 'xxx' INTO TABLE yyy 加载它(见后编辑)然后我在/user/hive/warehouse 中找到文件。我想知道它是否可以把它留在那里(我想我必须在我的目录中强制执行分区结构,但这很好)
  • 它是如何存储在 HDFS 中的?
  • 这是一个 CSV 文本文件。它是通过 Java 应用程序放置的。
  • 那么,你怎么知道,它是你存储文件的 HDFS 目录?你能检查一下 hive.metastore.warehouse.dir 属性在你的配置单元配置中的位置吗?

标签: hadoop hive hdfs


【解决方案1】:

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

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

注意LOCAL

【讨论】:

  • 谢谢,确实可以。另一个(效率较低的)选项是删除原始文件。那么我猜答案是:不,您不能告诉 hive 将数据留在原处并假设它是一个表。由于文件非常大,Java 应用程序使用 Hadoop 库直接写入 HDFS。我可以用 Java 到 Hive 连接器做同样的事情吗?或者,如果我通过 HDFS API 写入正确的 hive 目录,Hive 会认为它是一个数据文件吗?
  • 关于最后一部分。是的,如果你直接把文件放在HIVE仓库,那么日期就会在HIVE中得到,请记住要适应表定义的文件夹结构(stackoverflow.com/questions/15077046/…
【解决方案2】:

使用外部表:

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

【讨论】:

    【解决方案3】:

    您可以使用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/';
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 2013-04-18
        • 2017-06-30
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多