【问题标题】:sqoop how to handle deletion/updation of records in HDFSsqoop如何处理HDFS中记录的删除/更新
【发布时间】:2016-04-28 13:56:57
【问题描述】:

我需要每天使用 sqoop 将数据从 RDBMS 导入 HDFS。记录在 HDFS 中的 DeptID 列上进行分区,并且还分区到 Hive。有可能添加新记录,并且每天都会从源数据库中删除一些记录。我了解 sqoop 合并可以处理更新。我们总是希望 HDFS 中文件的状态与数据库记录的状态相同,即如果数据库中删除/更新的记录应该在 HDFS 中删除/更新。让我举一个小例子。

  1. 在第 1 天,从 1 到 100 的记录被移动到 HDFS。
  2. 在第 2 天添加新记录 101 到 150,并从数据库中删除 10 到 30。
  3. 现在 HDFS 应该包含记录为 1 到 10、31-150 条记录的分区。(应该从 HDFS 中删除 10 到 30 条记录)。

我想知道 sqoop 的当前行为是否可行,或者需要自定义 map-reduce 来完成此操作。

任何帮助表示赞赏。

提前致谢。

【问题讨论】:

    标签: mysql hadoop sqoop


    【解决方案1】:

    如果你的表不是太大,你可以通过 sqoop 做的最好的事情就是每天完全导入,覆盖之前的状态。删除已删除的数据是一项艰巨的任务,因为您不知道其中哪些被删除...

    【讨论】:

      【解决方案2】:

      这并非不可能。我已经使用 Sqoop 和 pig 脚本实现了相同的场景。您每天都使用 sqoop 以增量方式获取数据。

      如果在源中删除了某些数据,则源应为这些记录发送一些标志。这可以在源端实现。

      一旦你得到带有标志的记录,你就可以编写一个猪/蜂巢(我更喜欢猪)来从你在 hdfs 中的数据中过滤掉这些记录。

      请在以下链接中阅读有关 SCD 类型 2(渐变尺寸)的信息: https://en.wikipedia.org/wiki/Slowly_changing_dimension

      这应该可以消除您的所有疑虑。

      从 sqoop 加载快照也是一种选择,但如果您的数据量很大,它就无济于事。

      希望对你有帮助

      【讨论】:

      • 这里的意思是标志,在同一个表或新表中标识一个新列
      • 可能是同一张表中的新标志列,也可能是删除记录的新表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多