如何读取含二进制分隔符的CSV?NiFi ConvertRecord报错求助
问题描述
源CSV文件内容(行内字段由二进制分隔符\u0001分隔):
123456TextValue1 654321TextValue2
使用NiFi的ConvertRecord处理器将分隔符从\u0001替换为;,配置如下:
RecordReader(CSVReader)属性
- Schema Access Strategy: Use 'Schema Text' Property
- Schema Text:
#{text_schema} - Value Separator:
\u0001 - Treat First Line as Header: false
- Ignore CSV Header Column Names: true
RecordWriter(CSVRecordSetWriter)属性
- Schema Access Strategy: Use 'Schema Text' Property
- Schema Text:
#{text_schema} - Value Separator:
; - Include Header Line: true
text_schema定义
{ "type": "record", "name": "test_schema", "fields": [ { "name": "FIELD_1", "type": ["int","null"], "description": "FIELD_1" }, { "name": "FIELD_2", "type": ["string","null"], "description": "FIELD_2" } ] }
预期输出:
FIELD_1;FIELD_2 123456;TextValue1 654321;TextValue2
实际错误信息:
ERROR ConvertRecord[id=01931001-0d7e-1e43-146d-1a380e6d43b7] Failed to process FlowFile[filename=7365b509-7100-4bc2-a070-4cc8ce8377b9]; will route to failure: org.apache.nifi.processor.exception.ProcessException: Could not parse incoming data Caused by: org.apache.nifi.serialization.MalformedRecordException: Error while getting next record Caused by: java.lang.NumberFormatException: For input string: "123456TextValue1"
错误原因
CSVReader未能正确识别配置的\u0001分隔符,导致将整行内容当作FIELD_1的输入值。由于FIELD_1的类型定义为int,字符串"123456TextValue1"无法转换为整数,触发NumberFormatException。
核心问题是在NiFi属性配置中,直接输入\u0001不会被自动解析为对应的二进制控制字符,处理器将其视为普通字符串分隔符,而源数据中的实际分隔符是二进制的SOH(Start of Header,对应Unicode U+0001),两者不匹配。
解决方法
1. 正确配置分隔符
在NiFi UI的CSVReader的Value Separator属性中,直接输入实际的\u0001字符,而非字符串形式的\u0001:
- Windows系统:按住Alt键,依次按数字小键盘的0、0、0、1,输入SOH字符
- macOS/Linux系统:通过终端生成该字符后复制粘贴,或使用输入法的特殊字符插入功能直接插入SOH字符
2. 修正Schema语法问题
原Schema中FIELD_1的定义行末尾多了一个冗余逗号,虽不是当前错误的直接诱因,但可能导致后续解析问题,建议修正为标准JSON格式(如上述问题描述中调整后的Schema)。
3. 验证配置有效性
配置完成后,可使用NiFi的预览功能(部分版本支持)或发送测试FlowFile,确认CSVReader能正确拆分FIELD_1和FIELD_2字段后,再运行ConvertRecord处理器。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

