【问题标题】:Inserting record in Hive by appending通过追加在 Hive 中插入记录
【发布时间】:2015-07-09 01:07:38
【问题描述】:

我正在 Hive 外部表上执行 INSERT 语句。我注意到,对于每个新的 INSERT,都会在外部表引用的 HDFS 路径中创建一个新文件。我的问题是:

  1. 是否可以将新插入的数据作为追加而不是创建新文件?

  2. 我可以控制它以达到一定的大小,比如 1MB,然后 Hive 才会创建一个新文件来放置传入的插入?

【问题讨论】:

    标签: hive hdfs


    【解决方案1】:

    Cloudera 说:

    INSERT INTO 语法将数据附加到表中。现有数据文件保持原样,将插入的数据放入一个或多个新数据文件中。

    Hive 将追加表而不是基础文件。

    您可以强制 hive 使用另一个 create table 来构建表,并强制 reducer 到一个。这会将碎片文件复制到一个表中,并将它们组合到 HDFS 中的另一个位置。然后你可以交换 HDFS 中的文件。

    您可以将文件放置在一个暂存区,然后检查 hdfs 中文件的大小,然后将它们移到上面。然而,将文件暂时保存在本地文件系统上并将它们移动似乎更容易。

    要使用 hive 将文件合并到一个新文件中,您可以尝试:

    set hive.exec.dynamic.partition.mode=nostrict;
    set hive.exec.compress.intermediate=false;
    set hive.exec.compress.output=false;
    set hive.exec.reducers.max=1;
    
    create table if not exists db.table
    stored as textfiel as
    select * from db.othertable;
    

    db.othertable 是具有多个碎片文件的表。 db.table 将有一个包含组合数据的文本文件。

    我知道这并不理想,更像是一种变通方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2012-10-19
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多