问题
I am trying to replace a value with a variable assigned in flowfile.
In my flowfile, I have assigned flowID to flow_id variable.
In UpdateRecord processor, I try to update a column named /flow which has INFLOW and OUTFLOW I have following as ${field.value:replaceAll('INFLOW',$flow_id)}
Flowfile before UpdateRecord:
id,flow,flow_id
1,INFLOW,IN
2,OUTFLOW,OUT
3,INFLOW,IN
After the conversion flowfile should be:
id,flow,flow_id
1,IN,IN
2,OUT,OUT
3,IN,IN
But it fails with an error
unexpected token
Edit : After answer and comments
Now I have following settings:
${field.value:replace('INFLOW',flow_id)}
Due to unexpected token
flow_id
Same error for Literal Value and Record path value Replacement strategies.
回答1:
Set up the Nifi Workflow as shown below :
Set your input directory in the GetFile Processor. In the first UpdateRecord Processor concatenate the flow and flow_id columns and assign it into flow. Do this by changing the configurations of the First UpdateRecord processor as shown below.
The next UpdateRecord Processor replaces INFLOW and OUTFLOW accordingly. Set the configurations of the second UpdateRecord Processor as shown below.
Because of the initial concating " and , is added in the flow column. I have used the other two processors to remove them.
The third UpdateRecord Processor must have a new property named /flow and have the value ${field.value:replaceFirst(${field.value:substringAfter(',')},'')}. The rest of the configurations remain as the Second UpdateRecord Processor.
The Fourth UpdateRecord Processor must have a new property named /flow and have the value ${field.value:replaceFirst('"',''):replaceFirst(',','')}. The rest of the configurations remain as the Second UpdateRecord Processor.
Note: This answer was based on the concepts used in this question.
回答2:
This Answer is for Attribute substitution. OP actually wants to replace the column values from the other column values.
From the documentation, you can find the detailed usage of the variables and parameters.
- For the variables, see here
- For the parameters, see here
When you use a Variable such as
- Processor-specific attributes
- FlowFile properties
- FlowFile attributes
- From Variable Registry:
- User defined properties (custom properties)
- System properties
- Operating System environment variables
You can refer the variable such as:
${name of variable}
When you use a parameter from the parameter context, you can refer the parameter such as:
#{name of parameter}
In your case, you want to use a variable and so it should be:
${field.value:replaceAll('INFLOW',${flow_id})}
I have tested with the csv data,
index,flow
1,INFLOW
2,OUTFLOW
3,INFLOW
and the attribute flow_id with the value 'flowId'. Now, I have set the UpdateRecord processor with the options as follows:
Record Reader CSVReader
Record Writer CSVRecordSetWriter
Replacement Value Strategy Literal Value
/flow ${field.value:replace('INFLOW', ${flow_id})}
The output csv is as expected.
index,flow
1,flowID
2,OUTFLOW
3,flowID
来源:https://stackoverflow.com/questions/58974062/replace-a-value-with-a-variable-from-flowfile-using-apache-nifi