【问题标题】:Best approach for incremental data load in apache hive where sqoop is not loading the data into HDFS在 sqoop 未将数据加载到 HDFS 的 apache hive 中进行增量数据加载的最佳方法
【发布时间】:2018-05-02 14:34:25
【问题描述】:

我有一个场景-使用实用程序数据文件[每次都使用相同的名称-首先删除旧文件,然后加载更新/最新文件]定期从源系统推送到定义位置的 HDFS。 该数据文件需要进一步推入配置单元表中。

我正在寻找实现这一目标的最佳方法:

1) 在 hive 中创建一个外部表,指向 HDFS 中的位置 数据由 HDFS 中的实用程序推送,这将不断更新 一旦数据文件由 实用程序。

2) 使用 hive 中存在的数据创建一个内部/托管表 hi hive 仓库。现在使用配置为 cron 作业的 shell 脚本 - 在 定期检查 Hive 仓库中文件的时间戳 和文件存在于实用程序正在推送/更新的位置 数据,如果时间戳不同,则脚本将删除文件 从 hive 仓库中复制最新的文件到里面。

3) 每次使用其他名称创建新的配置单元表时,加载 将最新的数据文件放入其中,删除旧表,最后重命名新表 表到 hive 中的旧表名。

4) 还有其他方法吗?

我需要专家 cmet 来了解哪种方法似乎是最好的???我还担心我将使用这些方法中的任何一种执行任何数据文件更改并且有人同时访问该表的情况......有没有办法避免这种情况?

注意:数据加载到 HDFS/Hive 不是通过 Sqoop 作为增量加载发生的。此外,每次更新的文件都会再次包含完整的旧/更新数据以及新数据。因此,该文件的大小可能会随着时间的推移而增加,因为它同时包含旧数据、更新数据和新数据。

问候, 布佩什

【问题讨论】:

    标签: hadoop hive hiveql hadoop2


    【解决方案1】:

    如果您使用的是0.14以上的Hive版本,则可以进行上述操作。您应该使用hive的upsert功能。

    • 您可以创建外部表和托管表。两者应具有相同的表结构 - 外部表将包含来自实用程序文件(原始形式)的所有数据,并通过您可以更新的 upsert 功能,根据需要(SCD II)在 内部表中插入。我在下面创建的示例A 为外部B 为内部。更多信息请参见此链接https://hortonworks.com/blog/update-hive-tables-easy-way/

      merge into A using B on A.id = B.id when matched then update set email=B.email, when not matched then insert values(B.id, B.email);

    • 最后,您可以设置一个 oozie 工作流,它会定期执行插入/更新/删除或设置任何 cron 作业。此外,您需要定期从外部表中删除数据以维护 hdfs。

    你可以使用 kudu 代替 hive。请参考我的answer 这里

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多