在 Apache Druid 中处理来自商业系统的数据更新

问题描述 投票:0回答:1

我有一个内部构建的数字商务系统,并且运行良好。我们现在希望实施 OLAP 来为我们的客户提供高级报告和 BI 功能。

在寻找所需的组件时,我遇到了几种“不可变”数据存储,它们似乎是数据仓库的流行选择。我正在考虑 Apache Druid,因为它似乎与 Metabase(或其他类似工具)等可视化工具配合得很好。

我无法弄清楚如何处理这样一个不可变存储中的记录更新。与任何订单管理系统一样,我们系统中的订单也会在其生命周期内进行更新(状态、行项目、数量等)。在这种情况下,如何使用不可变存储?

即使我要使用星型模式之类的东西,我也可以看到事实表和维度表都需要更新。例如,如果销售记录为总收入事实,则金额可能需要更新,或者订单可能会被取消,商品可能会发生变化等。

我能想到的唯一方法是仅在事务关闭(即冻结)后将事务推送到数据仓库。在这种情况下,处理中订单的所有指标和报告都必须基于主数据库(又名 OLTP DB)(这违背了 Druid 的“实时分析”功能)。

这是唯一的出路吗?有更好的方法吗?

已在此处询问并部分回答了这个问题。如果我必须为订单总金额、单个行项目等维护单独的查找表,那么那里提到的方法可能会变得笨拙,因为它们都可能在订单生命周期过程中发生变化。

P.S:我在here发布了同样的问题,首先才意识到 Apache Druid 推荐 Stackoverflow。如果这种双重发布不合时宜,那么模组可以存档这个问题。

olap druid star-schema
1个回答
0
投票

Druid的很多实现都有类似的情况。 有两种方法可以解决这些更新:

  • 在实时流摄取中,行的多个更改会作为单个事件被摄取,并且查询在此类状态列上使用 LATEST 聚合函数来查看最新值。
  • 在批处理中,可以使用以下方法将不可变文件替换为新的摄取:
REPLACE INTO tableX OVERWRITE WHERE <time condition>
SELECT <your fields with or without transformations>
FROM TABLE(EXTERN( <the source of your data for reingestion>))
PARTITIONED BY <segment granularity>

在这里查看一些示例:https://druid.apache.org/docs/latest/multi-stage-query/examples#replace-for-replacing-a-specific-time-segment

© www.soinside.com 2019 - 2024. All rights reserved.