保持 table 最新 - Hive

Keeping table up to date - Hive

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

  1. 创建 table 具有:
create abc_distinct as 
select distinct * from abc;

这很好用,但是我怎样才能使 abc_distinct-table 保持最新状态,因为外部 table 每天都会收到新文件?

  1. 使用 SerDe 删除原始 table 中的数据冗余?关于如何消除基于 SerDe 的配置单元中的数据冗余,我一无所获 table?

附加信息:我的数据来自 Apache NiFi。

提前致谢!

我认为仅 Hive 无法为您的问题提供可靠的方法。您需要为此类用例进行适当的设计。我会从下面开始。

HDFS 上的两个区域,

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

维护 NiFi 摄取日志记录 (a table) 到 Postgres 或 MySQL Raw/Landing 区域和 ETL 过程(Spark 或 Sqoop)将由此日志记录驱动 table.将您的 cleanup/dedup 逻辑包含在 ETL 过程中,此过程会将新的 Raw/Landing 区域数据与已清理区域中的现有数据进行比较并加载差异,您可以为每个 record/row 构建哈希以进行比较和需要实施分区以提高性能。

用于记录 table 实现 -

当 NiFi 成功将文件放在 HDFS Raw/Landing 区域时,创建一条记录并设置一些状态,如 'READY_FOR_DEDUP'。 ETL 进程将仅选择状态为 'READY_FOR_DEDUP' 的文件,一旦 dedup/cleanup 完成并成功放入 HDFS Cleaned zone 进程将为相同记录设置状态为 'COMPLETED' 或 'FAILED', 这样它就不会在下一批中选择这样的文件 运行.

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