Apache nifi 默认转换中的Nifi JoltTransformRecord UUID未按预期工作

Apache nifi 默认转换中的Nifi JoltTransformRecord UUID未按预期工作,apache-nifi,Apache Nifi,我有一个Nifi工作流,用于对基于记录的数据进行一些操作。我必须在流文件中的每条消息中创建一个默认值uuid。 我的JoltTranformRecord配置如下 震动规格: [{ "operation": "shift", "spec": { "payload": "data.payload" } }, { "operation": "default", "spec": { "header": {

我有一个Nifi工作流,用于对基于记录的数据进行一些操作。我必须在流文件中的每条消息中创建一个默认值uuid。 我的JoltTranformRecord配置如下

震动规格:

[{
    "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。