从两个配置单元表中删除重复数据
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 中的数据文件夹在配置单元中创建表 - 删除重复的行