Apache nifi 默认转换中的Nifi JoltTransformRecord UUID未按预期工作
我有一个Nifi工作流,用于对基于记录的数据进行一些操作。我必须在流文件中的每条消息中创建一个默认值uuid。 我的JoltTranformRecord配置如下 震动规格:Apache nifi 默认转换中的Nifi JoltTransformRecord UUID未按预期工作,apache-nifi,Apache Nifi,我有一个Nifi工作流,用于对基于记录的数据进行一些操作。我必须在流文件中的每条消息中创建一个默认值uuid。 我的JoltTranformRecord配置如下 震动规格: [{ "operation": "shift", "spec": { "payload": "data.payload" } }, { "operation": "default", "spec": { "header": {
[{
"operation": "shift",
"spec": {
"payload": "data.payload"
}
}, {
"operation": "default",
"spec": {
"header": {
"source": "${source}",
"client_id": "${client_id}",
"uuid": "${UUID()}",
"payload_type":"${payload_type}"
}
}
}]
Shift操作和所有其他默认操作都正常工作。但是所有消息的UUID都是一样的。我需要为每条消息提供不同的UUID。我不想仅为此目的添加另一个处理器
我的工作流程如下:
JoltRecord处理器的读写器配置为:
InjectionSchemaJSONTreeReader(来自JsonTreeReader处理器):
InjectionSchemaAvroRecordSetWriter(来自AvroWriter处理器):
配置的架构注册表中定义了以下架构
com.xyz.ingestion.pre_json
{
"type": "record",
"name": "event",
"namespace": "com.xyz.ingestion.raw",
"doc": "Event ingested to kafka",
"fields": [
{
"name": "payload",
"type": [
"null",
"string"
],
"default": "null"
}
]
}
com.xyz.ingestion.raw -
{
"type": "record",
"name": "event",
"namespace": "com.xyz.ingestion.raw",
"doc": "Event ingested to kafka",
"fields": [
{
"type": {
"name": "header",
"type": "record",
"namespace": "com.xyz.ingestion.raw.header",
"doc": "Header data for event ingested",
"fields": [
{
"name": "payload_type",
"type": "string"
},
{
"name": "uuid",
"type": "string",
"size": "36"
},
{
"name": "client_id",
"type": "string"
},
{
"name": "source",
"type": "string"
}
]
},
"name": "header"
},
{
"type": {
"name": "data",
"type": "record",
"namespace": "com.xyz.ingestion.raw.data",
"doc": "Payload for event ingested",
"fields": [
{
"name": "payload",
"type": [
"null",
"string"
],
"default": "null"
}
]
},
"name": "data"
}
]
}
表达式语言按记录计算<代码>UUID()对每个评估执行。因此,对于每个记录,
uuid
必须是唯一的。从您提供的信息中,我看不出您为什么会获得重复的uuid
我试图用以下流程重现您的问题:
生成流文件:
SplitJson:将$
配置为JsonPathExpression
以将Json数组拆分为记录
震动传输记录:
正如您所看到的,我添加UUID的方式与您添加UUID的方式没有什么不同。但我得到了与预期不同的UUID:
我的读者和作者是不同的。附加屏幕截图。更新了工作流的完整屏幕截图。splitJson处理器是否基于记录?我不这么认为。完成了。还添加了架构配置。@BillGoldberg从您提供的信息中,我看不出为什么您总是得到相同的UUID。我注意到的唯一一件事是在avro模式中对UUID属性设置了size属性。但根据avro规范,它仅用于“固定”类型。尝试我提出的解决方案,并逐步发展到您的用例。我使用“SplitJson”将Json数组拆分为Json对象(记录),以模拟发出记录的ListenTCPRecord。