查找业务智能数据处理的最佳实践



我在一个管理人力资源的系统中工作,它有一个BI(业务智能(部分,用于从主系统收集和处理数据,然后将处理后的数据可视化为图表,表格等。

例如,我们希望看到人员年龄 [在 18 - 38 范围内](在轴 1 中(和他们的月薪(在轴 2 中([在完整工资范围内]之间的关系。聚合值是亲自计数的。还有一个称为"筛选器"的附加步骤,用于仅在组织 A 中筛选结果。

预期结果是这样的:

Age_18<28   Age_28<38 Age_38<48
Salary_<1000         12          25       45
Salary_1000<5000     12          10       2
Salary_>5000         1           1        2

目前的处理步骤如下:

  1. 搜索 axis1:搜索组织 A 中年龄范围为 [18-38] 的所有人员
  2. 搜索
  3. 轴 2:搜索组织 A 中的所有人员
  4. 合并轴 1 和轴 2 的结果
  5. 计算每个条件的人数,例如,具有 Age_18<28 和 Salary_<1000 的人数为 12,依此类推。
  6. 转换为 json 响应

因为有很多情况需要处理,所以逻辑变得难以维护。所有步骤都像上面一样手动处理。

所以我只是想知道这是否是一个常见问题,应该有一个通用的处理方式,例如设计模式、算法、库 (Java( 或特定概念来处理我以前从未知道的事情。

目标: - 使代码更简单、可读和可维护 - 易于扩展,即添加新案例

我将要尝试的: - 应用责任链+战略模式 - 只是想知道阿帕奇卡夫卡是否是正确的方式

注意:以上只是一个非常简单的情况,它可能在 1 轴中包含多个项目,并带有一些附加条件

一种思考方式是,您在 3 x 3 频率表中累积计数。

  1. 编写一个简单的方法来将薪水映射到索引,如下所示:

    < 1000         => 0
    1000 to < 5000 => 1
    >= 5000        => 2
    

    有多种方法可以对此方法进行编码。

  2. 编写一个简单的方法来将年龄映射到索引,如下所示:

    18 to < 28     => 0
    28 to < 38     => 1
    38 to < 48     => 2
    
  3. 像这样放在一起:

    int counts[][] = new int[3][3];
    for each person: p in ...
    counts[ageIndex(p.age)]][salaryIndex(p.salary)] += 1;
    

你可以很容易地在Java中实现它,也可能在SQL或BI系统的查询语言中实现它......如果有的话。

您可以将其推广到 M x M 和更多维度。 如果您为此付出一些努力,您实际上可以将映射实现为数据驱动的函数;例如

public int mapToIndex(int value, int[] ranges) { ... }

请注意,您正在做的事情存在缺陷。 员工年龄可能小于 18 岁或超过 48 岁。

最新更新