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

标签 hadoop apache-spark hive

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

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

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

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

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

最佳答案

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

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

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

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

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

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

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

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

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

通过使用这种方法,我们将拥有处理所有 upsert 操作的 Hbase 表,并且我们不能期望 hive-hbase 表与 native hive 表的相同性能会执行得更快,因为 hbase 表不适用于 sql 类型的查询, 如果你基于 Rowkey 访问数据,hbase 表是最有效的,

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

Tuning Hive Queries That Uses Underlying HBase Table

关于hadoop - 从两个配置单元表中删除重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49328417/

相关文章:

hadoop - hive 安装错误:URl

apache-spark - Spark Streaming - window() 是否缓存 DStreams?

hadoop - 尝试在Hive-1.1.0中加载HWI服务时遇到问题?

hadoop - reducer 后映射器启动缓慢

hadoop - 将边缘设备的平面数据文件导入HDFS并进行处理

apache-spark - Spark 中的加入和联合组

apache-spark - 如何将 parquet 文件的 int64 数据类型列转换为 SparkSQL 数据帧中的时间戳?

sql - Hive 将无法识别查询中第二个条件中的列名

sql - 在 Hive 中使用带有 if 条件的 select 语句来填充另一列

mongodb - 将数据从HDFS导出到MongoDB