【问题标题】:Dataweave equivalent of SQL join相当于 SQL 连接的 Dataweave
【发布时间】:2015-12-03 22:51:23
【问题描述】:

如何在 Dataweave 中执行相当于 SQL 连接的操作?我基本上是在执行查找。我在流变量中有 CSV 数据和 JSON 数据。我可以同时使用它们,但我不知道如何连接它们。假设 CSV 有两列:

Name,ExternalId
Foo,1
Bar,2
Baz,2

JSON 数据为:

{
    ExternalEntities: [
        { "Id": 1, "Name": "One", "Description": "Thing One" }
      , { "Id": 2, "Name": "Two", "Description": "Thing Two" }
    ]
}

最后,我想要一个List<Hashmap> ,其中包含以下内容(为方便起见,此处以 JSON 格式表示。)

[
    { "Name": "Foo", "ExternalName": "One", "ExternalDescription": "Thing One" }
  , { "Name": "Bar", "ExternalName": "Two", "ExternalDescription": "Thing Two" }
  , { "Name": "Baz", "ExternalName": "Two", "ExternalDescription": "Thing Two" }
]

【问题讨论】:

    标签: mule dataweave


    【解决方案1】:

    所以这里是一个使用 json 作为有效负载和 csv 作为查找表的示例。第一个流解析 json 并进行流查找,将“Id”作为有效负载传递。第二个流程将 csv 作为数组加载并通过传入的 Id 进行搜索。这将返回找到的 CSV 记录的映射,然后您可以在其中提取“名称”字段。

    可以在一个转换器中执行此操作,但为了演示,这更容易。如果您希望 csv 作为您的有效负载并希望 json 作为您的查找,您还可以通过一些修改来反转查找。

        <flow name="lookuptest" processingStrategy="synchronous">
            <poll doc:name="Poll">
                <logger level="INFO" doc:name="Logger" />
            </poll>
    
            <set-payload
                value="{ &quot;ExternalEntities&quot;: [ { &quot;Id&quot;: 1, &quot;Name&quot;: &quot;One&quot;, &quot;Description&quot;: &quot;Thing One&quot; } , { &quot;Id&quot;: 2, &quot;Name&quot;: &quot;Two&quot;, &quot;Description&quot;: &quot;Thing Two&quot; } ] }"
                doc:name="Set Payload"  mimeType="application/json"></set-payload>
    
            <dw:transform-message doc:name="Transform Message">
                <dw:input-payload doc:sample="string_2.dwl" />
                <dw:set-payload><![CDATA[%dw 1.0
    %input payload application/json
    %output application/json
    ---
    payload.ExternalEntities map ((value , index) -> {
        Name: lookup("NameLookup", [value.Id as :string]).Name
    })]]></dw:set-payload>
            </dw:transform-message>
    
            <object-to-string-transformer doc:name="Object to String"/>
    
            <logger level="ERROR" message="#[payload]" doc:name="Logger"/>
        </flow>
        <flow name="NameLookup" processingStrategy="synchronous">
            <set-variable value="#[payload[0]]" variableName="ExternalId"
                doc:name="Variable" />
    
            <set-payload
                value="#[Thread.currentThread().getContextClassLoader().getResourceAsStream('lookuptables/namelookup.csv')]"
                mimeType="application/csv" doc:name="Variable" />
    
            <dw:transform-message doc:name="Transform Message">
                <dw:input-payload doc:sample="string_2.dwl" />
                <dw:set-payload><![CDATA[%dw 1.0
    %input payload application/csv
    %output application/java
    ---
    (payload[?($.ExternalId == flowVars['ExternalId'])])[0]
    ]]></dw:set-payload>
            </dw:transform-message>
    
        </flow>
    

    【讨论】:

    • Ryan,经过一番调查,我最终尝试了一种不同的方法,但我接受了你的回答,因为这是“官方”的做法。最后我没有使用 DataWeave 进行合并,因为考虑到我拥有的数据大小,它花费的时间太长。
    【解决方案2】:

    虽然我接受了@Ryan Carter 的回答,但这是第二个可行的解决方案。

    %dw 1.0
    %output application/json
    ---
    
    flowVars.myCsv map (
      (row0, i) -> using (lookupElement = (flowVars.jsonLookup.ExternalEntities filter ((obj1) -> row0.ExternalId ~= obj1.Id))[0]) {
          Name: row0.Name
        , ExternalName: lookupElement.Name
        , ExternalDescription: lookupElement.Description
      } mapObject ({"$$": $, (StartsWithB:$[0] == "B") when $$ ~= "Name"})
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多