如何通过Nifi或sqoop在更新同一记录而不是创建新记录方面保持RDBMS与Hive的同步



需求:需要从RDBMS(SQL Server)中获取1000个表,并将其推送到配置单元中,以便近乎实时地运行分析和生成报告。我使用Nifi从RDBMS表中读取数据,并将表作为外部表进行推送。

问题:假设我在RDBMS中有一个表=Employee,有10条记录。我在Nifi中运行一个处理器,它不断地读取我的Employee表;lastModifiedTimeStamp";柱现在,假设Hive和Rdbms表都是同步的,都有10条记录,现在我更新Rdbms中的1行,现在Nifi将读取这个新更新的记录;PutORC"/"PutHDFS";处理器将新记录放入指定Hdfs目录下的新外部文件中。

现在,当我运行";从雇员中选择*";在Hive中,它返回11行,而不是10行。我希望它更新现有记录(如果存在)。

问题:对于RDBMS中的每一次更新,我的配置单元表都会随着重复记录呈指数级增长。如何使所有更新的记录与Hive几乎实时同步?使用Hive/hadoop的人员在查询时如何管理这些重复数据?这是一种正确的方法吗?

我知道有一个MERGE命令可以合并两个表以保持数据同步,但这将是一个非常繁重的操作,因为我们需要每5-10分钟将整个表的数据提取到暂存表中。

PutHiveQL可以帮助更新配置单元中的记录,但我现在确定,如何更新?我需要从CDC SQL Server表中提取吗?有办法吗?

注意:我知道我们不应该将配置单元用作RDBMS,但由于配置单元现在支持更新/删除操作,我想知道什么是正确的方法,以及人们如何使用它,并管理每次从RDBMS中提取时创建的重复数据。

TIA-

您想要实际创建两个表。并在两者的顶部粘贴一个View。

您可以使用视图查询数据。您有一个包含过去数据的基表,还有一个包含尚未合并到基表中的新数据的delta表。

然后,您可以编写一个视图查询,帮助保持只显示10条最新数据的记录。

定期使用增量记录更新基表。这样delta就不会变大,可以放在内存中,并且可以通过映射端连接连接到基表。

这有助于解决问题,我认为这对你有用。