Hive去重表实时更新及SerDe原表冗余数据删除问题咨询
Hive JSON-SerDe表去重及增量更新解决方案
一、去重表abc_distinct实时/增量更新方案
- 日级增量同步方案
你可以使用定时调度工具(Airflow、Azkaban、Linux crontab均可),每日在NiFi完成当日数据写入原表abc的操作后,执行增量去重写入逻辑,避免全量重算浪费资源。如果原表已经按天做分区,执行语句如下:
INSERT INTO abc_distinct SELECT DISTINCT * FROM abc WHERE dt = current_date(); -- 按实际分区字段调整过滤条件
如果原表没有分区,可通过HDFS文件修改时间过滤当日新增数据后去重写入即可。
- 近实时更新方案
如果需要分钟级别的数据时效性,可以开启Hive事务表特性,使用Flink/Spark Streaming流式消费NiFi写入的JSON数据,实时去重后写入abc_distinct表,无需等待每日批量调度。
二、原SerDe表层面去重实现方案
原生JSON-SerDe本身不支持自动去重,但可以通过以下方式直接在原表链路消除冗余,无需额外创建去重表:
- 上游NiFi前置去重(优先推荐)
直接在NiFi数据流中新增去重逻辑,数据写入HDFS前就过滤冗余行,从源头避免冗余进入Hive表。你可以使用NiFi自带的DetectDuplicate处理器,配置业务唯一键或者整行哈希值作为去重判断规则,落盘HDFS的文件本身无冗余,后续Hive侧无需做任何额外处理,是成本最低的方案。 - 视图封装方案
如果不能修改NiFi流程,可以创建去重视图对外提供查询,Power BI直接连接该视图即可,无需物化实体去重表,创建语句如下:
CREATE VIEW abc_distinct_view AS SELECT DISTINCT * FROM abc;
该方案无需额外存储,也不需要维护多表同步逻辑,缺点是数据量极大时查询性能低于实体去重表。
- 原表分区重写方案
每日原表当日分区写入完成后,直接重写该分区完成去重,不需要额外建表,执行语句如下:
INSERT OVERWRITE TABLE abc PARTITION (dt = 'xxxx-xx-xx') SELECT DISTINCT * FROM abc WHERE dt = 'xxxx-xx-xx';
该操作直接在原表执行,不新增存储资源,对外查询也不需要修改表名。
内容的提问来源于stack exchange,提问作者Nicko
相关产品推荐
相关产品推荐

