如何在NiFi中将流文件属性值类型从String转换为byte?
NiFi属性值类型转换:String转byte的实现方案
NiFi的流文件属性本质上全部为String类型,不存在原生的byte类型属性,但可以通过业务逻辑层面的处理实现字符串与字节数据的转换需求,以下是两种常见场景的实现方式:
场景1:将字符串内容编码为字节数组后存储
如果需要把字符串的字节形式保存为属性值,可通过Base64编码将字节数组转为字符串存储,后续使用时再解码:
- 使用
ExecuteScript处理器(推荐Groovy脚本),示例代码:def flowFile = session.get() if (!flowFile) return def targetAttr = flowFile.getAttribute("source-string-attr") if (targetAttr) { byte[] byteData = targetAttr.getBytes("UTF-8") def base64Encoded = new String(java.util.Base64.getEncoder().encode(byteData)) flowFile = session.putAttribute(flowFile, "encoded-byte-attr", base64Encoded) } session.transfer(flowFile, REL_SUCCESS)
场景2:将字符串表示的数值转为byte数值
如果属性值是字符串格式的数字(如"45"),需要转换为byte类型的数值,同样通过脚本处理(转换后仍以字符串形式存储属性值,使用时再转回byte):
ExecuteScript处理器的Groovy示例:def flowFile = session.get() if (!flowFile) return def numStr = flowFile.getAttribute("numeric-string-attr") if (numStr) { try { byte byteVal = numStr as byte flowFile = session.putAttribute(flowFile, "byte-value-attr", byteVal.toString()) session.transfer(flowFile, REL_SUCCESS) } catch (NumberFormatException e) { session.transfer(flowFile, REL_FAILURE) return } } else { session.transfer(flowFile, REL_SUCCESS) }
核心说明
NiFi不支持直接修改属性的数据类型,所有属性值均以字符串形式存储。所谓的“类型转换”是在业务逻辑中完成字符串与目标类型的互转,ExecuteScript或InvokeScriptedProcessor是实现这类自定义逻辑的最优选择。
内容的提问来源于stack exchange,提问作者Ashutosh Tiwari
相关产品推荐
相关产品推荐

