Hello.

Why don't you use a JoltTransformation process first to produce multiple
element in JSON according value in the array, and duplicate common
attributes for all.
And then, you do the split.

Etienne


Le jeu. 5 déc. 2019 à 14:11, James McMahon <jsmcmah...@gmail.com> a écrit :

> Daeho and Matt, thank you for all your suggestions. You helped me get to a
> solution. Here is how I unwound my incoming JSON with a simple flow,
>
> My incoming JSON flowfile looks like this:
> {
>   "KEY1":"value1",
>   "KEY2":"value2",
>   "FNAMES":["A","B","C","D"],
>   "KEY4":2
> }
> My goal is to have a flowfile for each of A, B, C, and D, with attribute
> THIS_NAME set to each singular FNAMES value, and also preserving KEY1,
> KEY2, KEY3 as flowfile attributes with their values pulled from the JSON.
>
> Final flow: ListFile->FetchFile->EvaluateJsonPath->SplitJson->ExtractText
>
> EvaluateJsonPath grabs all JSON key/values to attributes. At this point
> though, FNAMES attribute is ["A","B","C","D"] -- not quite what we require.
>
> SplitJson creates four flowfiles from one, its configuration setting
> JsonPath Expression as $.FNAMES . This results in four flowfiles. We're
> almost home.
>
> The flowfile content is now just each of the singular values from FNAMES.
> ExtractText creates attribute THIS_NAME configured like this:
> Include Capture Group 0 false
> Dynamic property added is THIS_NAME, configured to regex pattern (.*) .
> (Bad idea in general in any situation where content length may vary to
> large content, but not in our case where we know the values in the original
> JSON list are no larger than half a KB.)
>
> After this ExtractText step we have all our attributes, including
> fragment.count of 4 and a common fragment.identifier we can later use to
> reunite all after individual processing, with a MergeContent or similar.
>
> Thank you once again.
>
> On Thu, Dec 5, 2019 at 6:36 AM 노대호Daeho Ro <daeho...@bespinglobal.com>
> wrote:
>
>> Hm.... I might wrong.
>>
>> It wouldn't preserve other keys, so you have to evaluate other keys
>> first, and split FNAMES and evaluate again. Sorry for the confusion.
>>
>> 2019년 12월 5일 (목) 오후 8:29, James McMahon <jsmcmah...@gmail.com>님이 작성:
>>
>>> Typo in my initial reply. I did use $.FNAMES. It drops all the other
>>> key/value pairs in the output split result flowfiles.
>>> I configured my SplitJSON like so:
>>> JsonPathExpression    $.FNAME*S*
>>> Null Value Representation     empty string
>>>
>>> If there are two values in the json array for that key FNAME*S*, I do
>>> get two output flowfiles. But the only value present in the output is the
>>> value from the split of the value list of FNAMES. All my other JSON keys
>>> and values are not present. How do I tell SplitJSON to also retain all the
>>> key/values I did not split on?
>>>
>>> On Thu, Dec 5, 2019 at 6:15 AM 노대호Daeho Ro <daeho...@bespinglobal.com>
>>> wrote:
>>>
>>>> Path to be $.FNAMES, that will work I guess.
>>>>
>>>> 2019년 12월 5일 (목) 오후 8:10, James McMahon <jsmcmah...@gmail.com>님이 작성:
>>>>
>>>>> I should add that I also tried this for JsonPathExpression $.*
>>>>> That result also wasn't what I require, because it gave me 14
>>>>> different flowfiles each with only one value - - the two that resulted 
>>>>> from
>>>>> the FNAME key, and one for each of the other 12 keys that had only one
>>>>> value.
>>>>> My incoming JSON flowfile looks like this:
>>>>> {
>>>>>   "KEY1":"value1",
>>>>>   "KEY2":"value2",
>>>>>    .
>>>>>    .
>>>>>   "FNAMES":["A","B"],
>>>>>   "KEY13":2
>>>>> }
>>>>>
>>>>> This is what I need as output:
>>>>> {
>>>>>   "KEY1":"value1",
>>>>>   "KEY2":"value2",
>>>>>    .
>>>>>    .
>>>>>   "FNAMES":"A",,
>>>>>   "KEY13":2
>>>>> }
>>>>>
>>>>> and
>>>>>
>>>>> {
>>>>>   "KEY1":"value1",
>>>>>   "KEY2":"value2",
>>>>>    .
>>>>>    .
>>>>>   "FNAMES":"B",
>>>>>   "KEY13":2
>>>>> }
>>>>>
>>>>> How does one configure SplitJSON to accomplish that?
>>>>>
>>>>> On Thu, Dec 5, 2019 at 5:59 AM James McMahon <jsmcmah...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Daeho, I configured my SplitJSON like so:
>>>>>> JsonPathExpression    $.FNAME
>>>>>> Null Value Representation     empty string
>>>>>>
>>>>>> If there are two values in the json array for that key FNAME, I do
>>>>>> get two output flowfiles. But the only value present in the output is the
>>>>>> value from the split of the list. All my other JSON keys and values are 
>>>>>> not
>>>>>> present. How do I tell SplitJSON to also retain all the key/values I did
>>>>>> not split on?
>>>>>>
>>>>>>
>>>>>> On Wed, Dec 4, 2019 at 9:26 PM 노대호Daeho Ro <daeho...@bespinglobal.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Of course.
>>>>>>>
>>>>>>> There is a processor, the name is SplitJson. It can split the JSON
>>>>>>> text by defined key. For example, if there is a key name is 'fname' and 
>>>>>>> has
>>>>>>> the value [a, b, c]. Once you split the JSON by that processor, the
>>>>>>> resulted JSON will have the same key and values for others but 'fname' 
>>>>>>> will
>>>>>>> be a for the first JSON , b for the second and so on.
>>>>>>>
>>>>>>> After that, do the EvaluateJsonPath for FNAME then it will have a
>>>>>>> and b and c for each splited flowfiles. Thus, I recommend you to place 
>>>>>>> the
>>>>>>> SplitJson processor in front of the  EvaluateJsonPath processor.
>>>>>>>
>>>>>>> 2019년 12월 5일 (목) 오전 10:58, James McMahon <jsmcmah...@gmail.com>님이
>>>>>>> 작성:
>>>>>>>
>>>>>>>> I don’t quite follow, Daeho. FNAME is an attribute that results
>>>>>>>> *from* EvaluateJSonPath. Can you explain what you mean by
>>>>>>>> splitting the Jason key before EvaluateJSonPath?
>>>>>>>> Jim
>>>>>>>>
>>>>>>>> On Wed, Dec 4, 2019 at 7:45 PM 노대호Daeho Ro <
>>>>>>>> daeho...@bespinglobal.com> wrote:
>>>>>>>>
>>>>>>>>> I think you can split the json key for FNAME just before the
>>>>>>>>> EvaluateJsonPath processor. Then, the fragment.* attributes will be
>>>>>>>>> automatically created.
>>>>>>>>>
>>>>>>>>> 2019년 12월 5일 (목) 오전 8:24, Matt Burgess <mattyb...@apache.org>님이
>>>>>>>>> 작성:
>>>>>>>>>
>>>>>>>>>> Jim,
>>>>>>>>>>
>>>>>>>>>> As of NiFi 1.8.0 [1], you should be able to do this with
>>>>>>>>>> UpdateAttribute -> DuplicateFlowFile -> UpdateAttribute pattern,
>>>>>>>>>> the
>>>>>>>>>> first getting the number of values in the list via the count() EL
>>>>>>>>>> function, the second using that (minus 1) to generate duplicates,
>>>>>>>>>> each
>>>>>>>>>> with a copy.index attribute set. That attribute can be used in
>>>>>>>>>> another
>>>>>>>>>> UpdateAttribute with getDelimitedField() EL function for each flow
>>>>>>>>>> file to get its own value from FNAME. You may need to rename some
>>>>>>>>>> of
>>>>>>>>>> the attributes to fragment.* in order to use a merge processor,
>>>>>>>>>> but I
>>>>>>>>>> think all the necessary values are covered. Please let me know if
>>>>>>>>>> this
>>>>>>>>>> works for you or not, I added various improvements in order to
>>>>>>>>>> support
>>>>>>>>>> use cases like this, but if I missed something I can certainly
>>>>>>>>>> add it.
>>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>> Matt
>>>>>>>>>>
>>>>>>>>>> [1] https://issues.apache.org/jira/browse/NIFI-5454
>>>>>>>>>>
>>>>>>>>>> On Wed, Dec 4, 2019 at 4:54 PM James McMahon <
>>>>>>>>>> jsmcmah...@gmail.com> wrote:
>>>>>>>>>> >
>>>>>>>>>> > I have a series of attributes that result from an
>>>>>>>>>> EvaluateJSonPath. One of those attributes, FNAME, appears to be a 
>>>>>>>>>> list of
>>>>>>>>>> values like so: [“A”,”B”,”C”]. I want to split my flow file into one 
>>>>>>>>>> for
>>>>>>>>>> each list element. I need my results to have the original content, 
>>>>>>>>>> all the
>>>>>>>>>> original attributes, and its value for the split result out of the 
>>>>>>>>>> list as
>>>>>>>>>> a new attribute. I need to also know the split count, and be able to 
>>>>>>>>>> later
>>>>>>>>>> merge my flow files after evaluating the results of the split.
>>>>>>>>>> > How can I accomplish this?
>>>>>>>>>> > Thanks very much in advance.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> 노대호  *Daeho Ro */ Service Dev.
>>>>>>>>> daeho...@bespinglobal.com / *M* +82 10-6366-2636
>>>>>>>>> *KR* 06167 서울시 서초구 강남대로 327, 13층
>>>>>>>>> <https://www.google.com/maps/search/%EC%84%9C%EC%9A%B8%EC%8B%9C+%EC%84%9C%EC%B4%88%EA%B5%AC+%EA%B0%95%EB%82%A8%EB%8C%80%EB%A1%9C+327,+13%EC%B8%B5?entry=gmail&source=g>
>>>>>>>>> [image: Bespin Global] <https://bespinglobal.com/>
>>>>>>>>> 국내 최다 클라우드 인증 자격을 보유한 MSP • 국내 유일 ISO 인증을
>>>>>>>>> 확보한 MSP • 가트너가 인정한 한중일 유일한 MSP
>>>>>>>>> www.bespinglobal.com • ISO 27001:2013 • ISO 9001:2015 Certified
>>>>>>>>> ------------------------------
>>>>>>>>> *Confidentiality Note:* This email may contain confidential
>>>>>>>>> and/or private information.
>>>>>>>>> If you received this email in error please delete and notify the
>>>>>>>>> sender.
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> 노대호  *Daeho Ro */ Service Dev.
>>>>>>> daeho...@bespinglobal.com / *M* +82 10-6366-2636
>>>>>>> *KR* 06167 서울시 서초구 강남대로 327, 13층
>>>>>>> [image: Bespin Global] <https://bespinglobal.com/>
>>>>>>> 국내 최다 클라우드 인증 자격을 보유한 MSP • 국내 유일 ISO 인증을
>>>>>>> 확보한 MSP • 가트너가 인정한 한중일 유일한 MSP
>>>>>>> www.bespinglobal.com • ISO 27001:2013 • ISO 9001:2015 Certified
>>>>>>> ------------------------------
>>>>>>> *Confidentiality Note:* This email may contain confidential and/or
>>>>>>> private information.
>>>>>>> If you received this email in error please delete and notify the
>>>>>>> sender.
>>>>>>>
>>>>>>
>>>>
>>>> --
>>>> 노대호  *Daeho Ro */ Service Dev.
>>>> daeho...@bespinglobal.com / *M* +82 10-6366-2636
>>>> *KR* 06167 서울시 서초구 강남대로 327, 13층
>>>> [image: Bespin Global] <https://bespinglobal.com/>
>>>> 국내 최다 클라우드 인증 자격을 보유한 MSP • 국내 유일 ISO 인증을
>>>> 확보한 MSP • 가트너가 인정한 한중일 유일한 MSP
>>>> www.bespinglobal.com • ISO 27001:2013 • ISO 9001:2015 Certified
>>>> ------------------------------
>>>> *Confidentiality Note:* This email may contain confidential and/or
>>>> private information.
>>>> If you received this email in error please delete and notify the sender.
>>>>
>>>
>>
>> --
>> 노대호  *Daeho Ro */ Service Dev.
>> daeho...@bespinglobal.com / *M* +82 10-6366-2636
>> *KR* 06167 서울시 서초구 강남대로 327, 13층
>> [image: Bespin Global] <https://bespinglobal.com/>
>> 국내 최다 클라우드 인증 자격을 보유한 MSP • 국내 유일 ISO 인증을
>> 확보한 MSP • 가트너가 인정한 한중일 유일한 MSP
>> www.bespinglobal.com • ISO 27001:2013 • ISO 9001:2015 Certified
>> ------------------------------
>> *Confidentiality Note:* This email may contain confidential and/or
>> private information.
>> If you received this email in error please delete and notify the sender.
>>
>

Reply via email to