Apache NiFi:使用条件创建新列

时间:2019-11-20 04:23:28

标签: csv apache-nifi

我问了类似的问题。但是,我无法通过这种方法找到解决问题的方法。我有一个csv,看起来像这样:

studentID,regger,age,number
123,west,12,076392367
456,nort,77,098123124
231,west,33,076346325

我想添加一个新列并根据数字字段中的数据添加值。这是逻辑。

If the first 4 digits of data in the number column is equal to "0763" then the new column named (status) must be set as INSIDE or if it is any other value its OUTSIDE

如逻辑中所述,输出必须如下所示:

studentID,regger,age,number,status
123,west,12,076392367,INSIDE
456,nort,77,098123124,OUTSIDE
231,west,33,076346325,INSIDE

我的方法

我试图通过首先将数字列复制到状态列来实现此目的。然后尝试取前4位数字并进行处理。

希望您可以为Nifi Workflow提出一种建议,以实现这一目标。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下逻辑:-

SplitText-> ExtractText处理器-> RouteOnAttribute(如果前四个数字为0763,则添加条件)

-----匹配关系-> ReplaceText(从文件中提取的属性+“ INSIDE”)-> PutFile

-----不匹配关系-> ReplaceText(从文件中提取属性+“ OUTSIDE”)-> PutFile

希望这会对您有所帮助。

答案 1 :(得分:2)

我两次使用UpdateRecord处理器,并获得了所需的结果。

输入

我从您的输入数据开始。

studentID,regger,age,number
123,west,12,076392367
456,nort,77,098123124
231,west,33,076346325

过程

首先,如下设置UpdateRecord处理器:

Record Reader               CSVReader
Record Writer               CSVRecordSetWriter
Replacement Value Strategy  Record Path Value
/status                     /number

它将创建具有列status的值的新列number

第二,第一个输出应转到带有选项的另一个UpdateRecord处理器

Record Reader               CSVReader
Record Writer               CSVRecordSetWriter
Replacement Value Strategy  Literal Value
/status                     ${field.value:substring(0,4):equals('0763'):ifElse(${field.value:replace(${field.value},'INSIDE')},${field.value:replace(${field.value},'OUTSIDE')})}

这将为您提供最终结果。

请注意,数字列不是整数列,因此必须将记录读取器CSVReader的选项Schema Access Strategy设置为Use String Fields From Header

输出

studentID,regger,age,number,status
123,west,12,076392367,INSIDE
456,nort,77,098123124,OUTSIDE
231,west,33,076346325,INSIDE