sqoop如何处理HDFS

时间:2016-04-27 14:20:08

标签: mysql hadoop sqoop

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

  1. 在第1天,1到100的记录将移至HDFS。
  2. 在第2天,添加了新记录101到150,并在数据库中删除了10到30个记录。
  3. 现在HDFS应该包含记录为1到10,31-150条记录的分区。(应从HDFS中删除10 - 30条记录)。
  4. 我想知道是否可以使用sqoop的当前行为,或者需要自定义map-reduce来实现此目的。

    任何帮助表示感谢。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这不是不可能的。我使用Sqoop和pig脚本实现了相同的场景。您可以使用sqoop每天逐步获取数据。

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

一旦你获得了带有旗帜的记录,你就可以写一个猪/蜂巢(我更喜欢猪)从你在hdfs中的数据中过滤出那些记录。

请阅读以下链接中的SCD Type 2(慢速变化尺寸): https://en.wikipedia.org/wiki/Slowly_changing_dimension

这应该清除你所有的疑虑。

来自sqoop的快照加载也是一种选择,但如果您的数据规模庞大,则无法提供帮助。

希望这有帮助