You are returning self.d from process() which is a void method. Needs to return 
None.

Sent from my iPhone

> On Mar 30, 2016, at 5:00 PM, Madhukar Thota <madhukar.th...@gmail.com> wrote:
> 
> Matt,
> 
> I tired the following code but i am getting the following error. Can you help 
> me where i am doing wrong?
> 
> Error:
>  16:56:10 EDT
> ERROR6f15a6f2-7744-404c-9961-f545d3f29042
> ExecuteScript[id=6f15a6f2-7744-404c-9961-f545d3f29042] Failed to process 
> session due to org.apache.nifi.processor.exception.ProcessException: 
> javax.script.ScriptException: TypeError: None required for void return in 
> <script> at line number 38: 
> org.apache.nifi.processor.exception.ProcessException: 
> javax.script.ScriptException: TypeError: None required for void return in 
> <script> at line number 38
> 
> Code:
> 
> import urllib
> import urlparse
> import java.io
> from org.apache.commons.io import IOUtils
> from java.nio.charset import StandardCharsets
> from org.apache.nifi.processor.io import InputStreamCallback
> 
> 
> 
> class PyReadStreamCallback(InputStreamCallback):
>     def __init__(self):
>         self.d = {}
> 
>     def process(self, inputStream):
>         text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
>         split = (urllib.unquote(text)).split("&")
>         self.d = dict(s.split('=') for s in split)
>         return self.d
> 
> 
> flowFile = session.get()
> if (flowFile != None):
>     flowFile = session.read(flowFile, PyReadStreamCallback())
>     flowFile = session.putAttribute(flowFile, 
> PyReadStreamCallback().process())
>     session.transfer(flowFile, REL_SUCCESS)
> 
>> On Thu, Mar 24, 2016 at 8:59 AM, Matt Burgess <mattyb...@gmail.com> wrote:
>> Madhu,
>> 
>> The example from my blog post shows how to overwrite flow content, by first 
>> reading in content from an input stream, then processing it and writing back 
>> out to an output stream.  If for your example you just need to read from the 
>> incoming flow file and add some attributes, you can use the session.read() 
>> method instead of session.write(). In Jython the callback might look 
>> something like this:
>> 
>> class PyReadStreamCallback(InputStreamCallback):
>>   def __init__(self):
>>         pass
>>   def process(self, inputStream):
>>     text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
>>     # Do your parsing here
>> 
>> Note the stream callback methods do not have a reference to the 
>> ProcessSession, so you may want to create a dictionary for the attributes to 
>> be added, and pass that into the PyReadStreamCallback constructor. Then 
>> process() would add the attributes name/value pairs to the dictionary, and 
>> after you call session.read() in the main script, you can add all the 
>> attributes from the dictionary to the flow file.
>> 
>> The rest of the script will likely be similar to the blog post's script, 
>> note there is no "outputStream" passed in (as PyReadStreamCallback is a 
>> subclass of InputStreamCallback not StreamCallback), so there is no 
>> "outputStream.write()" call in the process() method or anywhere else in the 
>> script.
>> 
>> You may find another blog post helpful: 
>> http://funnifi.blogspot.com/2016/02/executescript-explained-split-fields.html
>>   Although it uses Groovy as the language, it also explains some of the NiFi 
>> Java API, at least the part that deals with reading/writing flow files, 
>> immutable flow file references, etc.
>> 
>> Let me know if this works for you and/or if you have other questions or 
>> issues.
>> 
>> Cheers,
>> Matt
>> 
>>> On Thu, Mar 24, 2016 at 8:42 AM, Madhukar Thota <madhukar.th...@gmail.com> 
>>> wrote:
>>> Hi Matt,
>>> 
>>> Do you have an example on how to use ExecuteScript on flowContent?
>>> 
>>> I have the following url encoded string as flow content, where i would like 
>>> use python parse it to get flow artibutes based on key values pairs.
>>> 
>>> rt.start=navigation&rt.tstart=1458797018682&rt.bstart=1458797019033&rt.end=1458797019075&t_resp=21&t_page=372&t_done=393&t_other=t_domloaded%7C364&r=http%3A%2F%2Flocalhost%3A63342%2FBeacon%2Ftest.html&r2=&u=http%3A%2F%2Flocalhost%3A63342%2FBeacon%2Ftest.html&v=0.9&vis.st=visible
>>> 
>>> -Madhu
>>> 
>>>> On Thu, Mar 24, 2016 at 12:34 AM, Madhukar Thota 
>>>> <madhukar.th...@gmail.com> wrote:
>>>> Hi Matt,
>>>> 
>>>> Thank you for the input. I updated my config as you suggested and it 
>>>> worked like charm and also big thankyou for nice article. i used your 
>>>> article as reference when i am started Exploring ExecuteScript.
>>>> 
>>>> 
>>>> Thanks
>>>> Madhu
>>>> 
>>>> 
>>>> 
>>>>> On Thu, Mar 24, 2016 at 12:18 AM, Matt Burgess <mattyb...@gmail.com> 
>>>>> wrote:
>>>>> Madhukar,
>>>>> 
>>>>> Glad to hear you found a solution, I was just replying when your email 
>>>>> came in.
>>>>> 
>>>>> Although in ExecuteScript you have chosen "python" as the script engine, 
>>>>> it is actually Jython that is being used to interpret the scripts, not 
>>>>> your installed version of Python.  The first line (shebang) is ignored as 
>>>>> it is a comment in Python/Jython.
>>>>> 
>>>>> Modules installed with pip are not automatically available to the Jython 
>>>>> engine, but if the modules are pure Python code (rather than native C / 
>>>>> CPython), like user_agents is, you can import them one of two equivalent 
>>>>> ways:
>>>>> 
>>>>> 1) The way you have done, using sys.path.append.  I should mention that 
>>>>> "import sys" is done for you so you can safely leave that out if you wish.
>>>>> 2) Add the path to the packages 
>>>>> ('/usr/local/lib/python2.7/site-packages') to the Module Path property of 
>>>>> the ExecuteScript processor. In this case the processor effectively does 
>>>>> Option #1 for you.
>>>>> 
>>>>> I was able to get your script to work but had to force the result of 
>>>>> parse (a UserAgent object) into a string, so I wrapped it in str:
>>>>> 
>>>>> str(parse(flowFile.getAttribute('http.headers.User-Agent')).browser)
>>>>> 
>>>>> You're definitely on the right track :)  For another Jython example with 
>>>>> ExecuteScript, check out this post on my blog: 
>>>>> http://funnifi.blogspot.com/2016/03/executescript-json-to-json-revisited_14.html
>>>>> 
>>>>> I am new to Python as well, but am happy to help if I can with any issues 
>>>>> you run into, as it will help me learn more as well :)
>>>>> 
>>>>> Regards,
>>>>> Matt
>>>>> 
>>>>> 
>>>>>> On Thu, Mar 24, 2016 at 12:10 AM, Madhukar Thota 
>>>>>> <madhukar.th...@gmail.com> wrote:
>>>>>> I was able to solve the python modules issues by adding the following 
>>>>>> lines:
>>>>>> 
>>>>>> import sys
>>>>>> sys.path.append('/usr/local/lib/python2.7/site-packages')  # Path where 
>>>>>> my modules are installed.
>>>>>> 
>>>>>> Now the issue i have is , how do i parse the incoming attributes using 
>>>>>> this libarary correctly and get the new fields. I am kind of new to 
>>>>>> python and also this my first attempt of using python with nifi.
>>>>>> 
>>>>>> Any help is appreciated.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Wed, Mar 23, 2016 at 11:31 PM, Madhukar Thota 
>>>>>>> <madhukar.th...@gmail.com> wrote:
>>>>>>> Hi 
>>>>>>> 
>>>>>>> I am trying to use the following script to parse http.headers.useragent 
>>>>>>> with python useragent module using ExecuteScript Processor.
>>>>>>> 
>>>>>>> Script:
>>>>>>> 
>>>>>>> #!/usr/bin/env python2.7
>>>>>>> from user_agents import parse
>>>>>>> 
>>>>>>> flowFile = session.get()
>>>>>>> if (flowFile != None):
>>>>>>>   flowFile = session.putAttribute(flowFile, "browser", 
>>>>>>> parse(flowFile.getAttribute('http.headers.User-Agent')).browser)
>>>>>>>   session.transfer(flowFile, REL_SUCCESS)
>>>>>>> 
>>>>>>> 
>>>>>>> But ExecuteProcessor, complaining about missing python module but 
>>>>>>> modules are already installed using pip and tested outside nifi. How 
>>>>>>> can i add or reference this modules to nifi?
>>>>>>> 
>>>>>>> Error:
>>>>>>> 
>>>>>>> 23:28:03 EDTERRORaf354413-9866-4557-808a-7f3a84353597
>>>>>>> ExecuteScript[id=af354413-9866-4557-808a-7f3a84353597] Failed to 
>>>>>>> process session due to 
>>>>>>> org.apache.nifi.processor.exception.ProcessException: 
>>>>>>> javax.script.ScriptException: ImportError: No module named user_agents 
>>>>>>> in <script> at line number 2: 
>>>>>>> org.apache.nifi.processor.exception.ProcessException: 
>>>>>>> javax.script.ScriptException: ImportError: No module named user_agents 
>>>>>>> in <script> at line number 2
>>>>>>> 
>>>>>>> 
>>>>>>>  
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to