从两个配置单元表中删除重复数据

Posted

技术标签:

【中文标题】从两个配置单元表中删除重复数据【英文标题】:De-duplication from two hive tables 【发布时间】:2018-03-16 19:43:46 【问题描述】:

我们遇到了一个问题——我们试图在 RDBMS(源)和 hive(目标)之间进行近乎实时的同步。基本上,源将更改(插入、更新和删除)作为 avro 文件推送到 HDFS。这些被加载到外部表(使用 avro 模式)中,进入 Hive。 ORC中还有一个基表,里面有Source推入新记录集之前进来的所有记录。

收到数据后,我们必须进行重复数据删除(因为可能会更新现有行)并删除所有已删除的记录(因为可能会从源中删除)。

我们现在使用 rank() 对外部表和基表联合上的分区键执行重复数据删除。然后将结果推送到一个新表中,交换名称。这需要很多时间。

我们尝试使用合并、酸性事务,但对分区进行排名,然后过滤掉所有行,这给了我们目前最好的时间。

有没有更好的方法来做到这一点?关于完全改进流程的任何建议?我们有很多表,所以目前我们没有任何分区或存储桶。

【问题讨论】:

【参考方案1】:

您可以尝试将所有事务数据存储到 Hbase 表中。

使用RDBMS表的主键作为行键将数据存储到Hbase表中:-

一旦您使用 NiFi 处理器(executesql、Querydatabasetable..etc)从 RDBMS 中提取所有数据,我们将从处理器中获得 Avro 格式的输出。

您可以使用 ConvertAvroToJson 处理器,然后使用 SplitJson 处理器从 json 记录数组中拆分每条记录。

将Rowkey作为主键的Hbase表中的所有记录存储在RDBMS表中。

当我们基于 Last Modified Date 字段获得增量负载时,我们将从 RDBMS 表中获得更新的记录和新添加的记录。

如果我们获得了现有 rowkey 的更新,那么 Hbase 将覆盖该记录的现有数据,对于新添加的记录,Hbase 会将它们作为新记录添加到表中。

然后通过使用 Hive-Hbase 集成,您可以获得使用 Hive 公开的 Hbase 表数据。

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

通过使用这种方法,我们将拥有 Hbase 表来处理所有的 upsert 操作,我们不能期望 hive-hbase 表与原生 hive 表的性能相同,因为 hbase 表不适用于 sql如果你是基于 Rowkey 访问数据,那么 hbase 表是最有效的,

如果我们要拥有数百万条记录,那么我们需要对 hive 查询进行一些调整

Tuning Hive Queries That Uses Underlying HBase Table

【讨论】:

以上是关于从两个配置单元表中删除重复数据的主要内容,如果未能解决你的问题,请参考以下文章

从 HDFS 中的数据文件夹在配置单元中创建表 - 删除重复的行

如何删除单元格 Hive 表中的重复值

Excel - 如何删除数据集中单元格B为空的所有行[重复]

从 sqlite 数据库中删除重复的行

怎么将两个EXCEL表格合并后去除重复数据

无法从 Netezza 表中删除重复数据