2

如何在 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" }
]
4

2 回答 2

3

所以这里是一个使用 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>
于 2015-12-02T15:59:02.710 回答
1

这是第二个可行的解决方案,尽管我接受了@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"})
)
于 2015-12-03T14:51:23.777 回答