1

我正在尝试加入两个表,其中表 1 中的列“包含”表 2 中的一列中的数据,即考虑以下假设:

  • 错误日志

    id| description
    1 | this is right, bla bla, bla
    2 | this is , bla bla, bla, wrong
    3 | this is , bla bla, bla, a disaster, , bla bla, bla
    4 | bla, bla, bla
    
  • 结果类型

    id|type
     1|Right
     2|Wrong
     3|Disaster
    

现在,我希望加入这两个表并将结果存储在第三个表中,即

  • 表格分析

     id|error_log_id|result_type_id
     1 | 1          | 1
     2 | 2          | 2
     3 | 3          | 3
     4 | 4          | null
    

通常,在任何 RDBMS 中,我可以通过具有类似条件的左连接轻松完成此操作,即

select e.error_log_id, r.result_type_id from error_log e 
left join result_type r on e.description like '%'+ r.type +'%'

但我似乎无法通过 snaplogic 找到这样做?我尝试了 Snap Join,但它只提供等于连接条件,即 在此处输入图像描述

任何建议都受到高度赞赏。

4

2 回答 2

1

假设 in 中的记录数result_type不会经常变化并且比 中的记录数小很多error_log,您可以使用In-memory Lookupsnap 而不是Joinsnap。除此之外,没有直接的方法可以使用常规快照来执行此操作。我建议尽可能在数据库中进行复杂的查询。以下是使用Scriptsnap 的实现。

样品管道

在此处输入图像描述

内存查找

添加一个join_id带有值1(或其他)的字段(或其他),并在查找中基于此字段加入。这将在所有传入文档中添加整个查找(在您的情况下为类型)。

在此处输入图像描述

脚本

try { load("nashorn:mozilla_compat.js"); } catch(e) { }

importPackage(com.snaplogic.scripting.language);

importClass(java.util.ArrayList);
importClass(java.util.LinkedHashMap);

var impl = {
    
    input : input,
    output : output,
    error : error,
    log : log,

    execute : function () {
       this.log.info("Executing Transform Script");
        while (this.input.hasNext()) {
            try {
                var inDoc = this.input.next();
                var outDocs = new ArrayList();

                var errorLogId = inDoc.id;
                var description = inDoc.description;
                var types = inDoc.types;
                var flag = false;
                for(var idx in types) {
                    var type = types[idx];
                    if(description.toLowerCase().contains(type.type.toLowerCase())) {
                        var outDoc = new LinkedHashMap();
                        outDoc.put('error_log_id', errorLogId);
                        outDoc.put('result_type_id', type.id);
                        outDocs.add(outDoc);
                    }
                }

                if(outDocs.isEmpty()) {
                    var outDoc = new LinkedHashMap();
                    outDoc.put('error_log_id', errorLogId);
                    outDoc.put('result_type_id', null);
                    outDocs.add(outDoc);
                }

                for(var idx in outDocs) {
                    var outDoc = outDocs[idx];
                    this.output.write(inDoc, outDoc);
                }
            }
            catch (err) {
                var errDoc = new LinkedHashMap();
                errDoc.put("error", err);
                this.log.error(err);
                this.error.write(errDoc);
            }
        }
        this.log.info("Script executed");
    },
    
    cleanup : function () {
       this.log.info("Cleaning up")
    }
};

var hook = new com.snaplogic.scripting.language.ScriptHook(impl);

输出

在此处输入图像描述

于 2021-04-13T15:08:20.320 回答
0

这是正确的快照,尝试将“连接类型”更改为相关值,例如 Outer。

于 2021-04-07T20:33:35.810 回答