Hi Dirk,

Many thanks for sharing your code and experience! I will probably need to 
implement something like this.

Thanks again & all the best

Valentina
________________________________
From: Dirk Arends <dirk.are...@fontis.com.au>
Sent: Thursday, 19 November 2020 23:21
To: users@nifi.apache.org <users@nifi.apache.org>
Subject: Re: Data enrichment using several keys

Hi Valentina,

Not sure if this will work for you, but I have achieved 2 key lookups using a 
LookupService by creating a composite field in the csv. Admittedly I was 
creating the csv in nifi from another data source so I had control of the CSV's 
shape.

You may be able to form a composite key in your streamed data without needing a 
script but I wrote a custom groovy script to combine the two fields in my 
dataset on the fly to use in the look up.

// Near the start of the `onTrigger`
        def lookupService = 
context.getProperty(RECORD_LOOKUP).asControllerService(LookupService)

// Located in a function called from both locations of `// TODO process first 
record`
            final Optional<?> lookupValueOption

            def key = 
"${record.getValue('ReferenceTypeId')}-${record.getValue('Id')}".toString()

            def lookupCoordinates = ['key':key]

            try {
                lookupValueOption = lookupService.lookup(lookupCoordinates)
            } catch (final Exception e) {
                throw new ProcessException('Failed to lookup coordinates ' + 
lookupCoordinates + ' in Lookup Service', e)
            }

            if (!lookupValueOption.isPresent()) {
                getLogger().debug('Reference ' + lookupCoordinates + ' not 
found in Lookup Service. Not adding to reference map')
                continue
            }

            def Record lookupRecord = (Record) lookupValueOption.get()
            def referenceTypeCode = lookupRecord.getValue('ReferenceTypeCode')

Matthew's blog post(s) helped me immensely with this adventure:

http://funnifi.blogspot.com/2019/04/record-processing-with.html<https://eur02.safelinks.protection.outlook.com/?url=http%3A%2F%2Ffunnifi.blogspot.com%2F2019%2F04%2Frecord-processing-with.html&data=04%7C01%7Cvalentina.ivanova%40ri.se%7Ce1c75c819d9d4e87182f08d88cd97c95%7C5a9809cf0bcb413a838a09ecc40cc9e8%7C0%7C1%7C637414214204221990%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=eocU0Gxc3CaC%2FceHQBDJOxYzJGOgtEDijpFaF2qRMNc%3D&reserved=0>

See how you go.

Cheers,
Dirk.

On Fri, 20 Nov 2020 at 02:29, Valentina Ivanova 
<valentina.ivan...@ri.se<mailto:valentina.ivan...@ri.se>> wrote:
Hello everyone!

I am working on the following data enrichment scenario. I am receiving a 
streaming data from which I am extracting several attributes. Now I want to use 
three of these attributes as keys to query a csv file and retrieve two values 
from it. (Something equivalent to this SQL statement)
SELECT value1, value2 FROM csv_file WHERE key1=att_key_1 and key2=att_key_2 and 
key3=att_key_3
I made this scenario work using QueryRecord, however, I need to read the csv 
file every time I receive the streaming data - which does not seem really 
scalable solution.

I have looked for other options and read about LookupRecord[1] and 
LookupAttribute[2] which are build for such scenarios but unfortunately the 
respective LookupServices does not seem to allow specifying more than one key. 
I always get an ERROR saying that the expected key should be one of [my csv 
file attributes]. (Using one key at a time also results in an error saying that 
the values for it repeat which is the case as only the combination of the three 
is unique)

So I am wondering if someone has encountered a similar problem and can provide 
any advice.  (For now I would prefer not to implement a custom processor but if 
nothing works any directions and templates that would help will be also very 
appreciated.)

Many thanks in advance,

Valentina


[1] 
https://community.cloudera.com/t5/Community-Articles/Data-flow-enrichment-with-NiFi-part-1-LookupRecord-processor/ta-p/246940<https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcommunity.cloudera.com%2Ft5%2FCommunity-Articles%2FData-flow-enrichment-with-NiFi-part-1-LookupRecord-processor%2Fta-p%2F246940&data=04%7C01%7Cvalentina.ivanova%40ri.se%7Ce1c75c819d9d4e87182f08d88cd97c95%7C5a9809cf0bcb413a838a09ecc40cc9e8%7C0%7C1%7C637414214204221990%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=P0G7HLt7n2oG7zjrptWkwDw3uJU7K4nhqui0YGFxl4s%3D&reserved=0>
[2] 
https://community.cloudera.com/t5/Community-Articles/Data-flow-enrichment-with-NiFi-part-2-LookupAttribute/ta-p/247072<https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcommunity.cloudera.com%2Ft5%2FCommunity-Articles%2FData-flow-enrichment-with-NiFi-part-2-LookupAttribute%2Fta-p%2F247072&data=04%7C01%7Cvalentina.ivanova%40ri.se%7Ce1c75c819d9d4e87182f08d88cd97c95%7C5a9809cf0bcb413a838a09ecc40cc9e8%7C0%7C1%7C637414214204231989%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=vYbttfvP2dQfZYTfFQSLjYjLYGIcpgIkU3zp276bYaw%3D&reserved=0>



--
Regards,

--
Dirk Arends

Reply via email to