【问题标题】:Which is preferred for mapping values: reusing mapping functions OR building reference tables to do lookups?哪个更适合映射值:重用映射函数或构建引用表进行查找?
【发布时间】:2020-09-11 12:36:24
【问题描述】:

映射值首选哪个:重用映射函数或构建引用表进行查找?

这是一个非常笼统的高级问题,我相信大部分与语言无关。例如,我将使用SAS,但我也想知道R 和python 中的人们对此有何看法。

我所在的团队喜欢使用映射函数来获取输入并生成一些输出,通常以一对一的方式。例如,这里有一些修改过的 SAS 代码,显示了我的团队通常做的事情:

proc fcmp;
    function mapFunction($ input);
        output = .;
        if input= "Day zero" then output= 0;
            else if input = "Day one" then output = 1;
            else if input = "Day two" then output = 2;
        return(output);
    endsub;
run;

当需要进行映射时,团队将在多个其他程序中使用mapFunction。

这违背了我的直觉。我的直觉是使用一次映射函数来生成一组键:值对或字典或两列表,然后使用查找/索引/加入/合并操作以引用表。

我很难解释为什么这是我的直觉,但确实如此。 感觉最好有一个参考表而不是重复调用自定义函数。但是,我不相信自己的感觉,我想听听其他人的意见,看看我是否可以将一种技术合理化。

有人可以提供论据/反论据来支持一种技术吗?

谢谢!

【问题讨论】:

  • 如果值的数量是 low 并且 stable 使用 CASE 实现 SQL UDF 是个好主意,if DBMS 无需额外开销即可处理该问题,即只需将函数调用替换为 CASE 表达式。

标签: python sql r sas database-optimization


【解决方案1】:

我进行了很多转换,其中涉及重新映射代码。你的情况可能有点不同。转换是一次性事件,而不是像夜间 DW 刷新这样的持续转换。

按照您的建议,默认位置是使用表格。它有一个真正的好处,a)您可以在转换之前查询数据以检查地图中不存在的值; b) 责任回到业务来确认代码映射是否正确。

转换的业务规则在不断变化时变得更加棘手。例如,您的第一个剪辑可能提供了一个简单的地图,但有人说“除了这些代码,您需要在其中查找额外的值”,然后您突然需要一个函数。此时,您需要重新访问代码库以查找映射表的使用位置并更新为函数。这可能是一个经验教训,具体取决于代码库的大小。

我已经使用函数来包装映射表的使用。如果您不知道一个月后哪个代码会出现问题,这可能很有用。函数只是从映射表中选择一个值,就像您在连接中所做的那样。执行起来会更慢,但如果你优化程序员的时间而不是执行时间,那么它会起作用。在任何情况下,您都可以从代码映射中获得数据可见性,以及从函数中获得范围蔓延的灵活性。当范围发生变化时,只需更新函数即可。

当您说“多个其他程序”时,听起来像是一个危险信号。如果您将数据存储在映射表中,存储它们的数据库是否对这些程序可见?这将是一个考虑因素,大人。

【讨论】:

    【解决方案2】:

    你的评价标准是什么?

    您在寻找:

    • 程序运行时间
    • 开发者编码时间
    • 可用性
    • 易于维护

    不同的人优先考虑不同的事情。表方法的一个好处是它是通用的、简单的并且在几乎任何语言中都有意义。但是......这并不意味着它是该语言的最佳选择。每种语言在底层实现事物的方式将影响上述标准。

    在 SAS 中,我很少使用 FCMP,但格式是其中最快的方法之一,并且它后面确实有一个可以轻松更新的表格,所以这将是我在 SAS 中的选择。它比 HASH 和 SET+KEY 方法稍慢,但更易于使用和维护,从长远来看,这些方法最终会节省更多时间。在我 99% 的项目中,我优先考虑人工时间而不是计算机时间。

    如果您在 lexjansen.com 上进行搜索,您会发现许多关于进行查找的不同方法以及它们的运行时间比较的论文。 https://www.lexjansen.com/phuse/2007/cs/CS06.pdf

    【讨论】:

    • 我同意 - 如果您在 SAS 中工作,格式似乎非常适合给出的示例。如果您需要转换为另一种语言,将格式导出到查找表并不难。
    猜你喜欢
    • 2011-08-04
    • 2012-06-27
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多