保持表更新- Hive



我目前有一个问题与我的hive数据库。我有两个外部表abcxyz,它们使用基于hdfs目录的JSON-SerDe。我需要用Power BI读取这些表,并且由于JSON文件的数量,我想删除两个表中的一个中的冗余行。我有两个想法,但不知道如何实现它们:

  1. 创建表
create abc_distinct as 
select distinct * from abc;

这工作得很好,但我怎么能保持abc_distinct表是最新的,因为外部表每天得到新的文件?

  1. 使用SerDe删除原始表中的数据冗余?我没有发现如何消除基于serde的hive表中的数据冗余?

附加信息:My data comes from Apache NiFi.

提前感谢!

我不认为Hive单独会提供一个健壮的方法来解决您的问题。您需要为这样的用例进行适当的设计。我会像下面这样开始:

HDFS的两个zone,

  1. NiFi摄取的JSON/AVRO文件的Raw/Landing zone,可以被Hive外部表访问
  2. 清理区(Hive Managed ORC表),将作为Power BI的源,并通过消耗Raw/Landing zone来填充一些ETL进程。

维护NiFi摄取日志(一个表)到Postgres或MySQL的Raw/Landing zone和ETL进程(Spark或Sqoop)将由这个日志表驱动。将清理/删除逻辑包含在ETL进程中,该进程将比较新的原始/着陆区数据与已清理区域中的现有数据并加载差异,您可以为每条记录/行构建散列进行比较,并需要实现分区以提高性能。

日志表实现-

当NiFi成功地将文件放到HDFS的Raw/Landing zone时,创建一个记录并设置一些状态,如'READY_FOR_DEDUP'。ETL进程将只选择状态为"READY_FOR_DEDUP"的文件,一旦完成了dedup/cleanup并成功放入HDFS清理区后,进程将为相同的记录设置状态为"COMPLETED"或"FAILED",以便它不会在下一次批处理运行中选择此类文件。

我会说,编写Spark应用程序来执行ETL任务,以便您可以使用cron, Airflow或Oozie调度spark-submit执行。

最新更新