Link Search Menu Expand Document Documentation Menu

list_to_map

list_to_map 处理器将事件中包含 key 字段的对象列表转换为目标键的映射。

配置

下表描述了用于生成映射目标键的配置选项。

选项 必需 类型 描述
source 字符串 具有 key 字段的对象列表,这些对象将被转换为生成映射的键。
目标 字符串 生成映射的目标。如果未指定,生成的映射将放置在根节点中。
key 有条件地 字符串 要提取为生成映射中键的字段的键。如果 use_source_keyfalse,则必须指定。
use_source_key 布尔型 当为 true 时,生成的映射中的键将使用源中的原始键。默认为 false
value_key 字符串 指定后,源列表中对象中给定 value_key 的值将被提取并根据生成的映射转换为此选项指定的值。如果未指定,源列表中包含的对象在映射时将保留其原始值。
extract_value 布尔型 当为 true 时,源列表中的对象值将被提取并添加到生成的映射中。当为 false 时,源列表中的对象值将按其在源列表中的样子添加到生成的映射中。默认为 false
扁平化 布尔型 当为 true 时,生成的映射输出中的值会根据 flattened_element 扁平化为单个项。否则,映射到生成的映射值的对象将显示为列表。
flattened_element 有条件地 字符串 flatten 设置为 true 时,要保留的元素,可以是 firstlast

用法

以下示例展示了如何在您自己的源上使用 list_to_map 处理器之前测试其用法。

创建一个名为 logs_json.log 的源文件。由于 file 源将 .log 文件中的每一行作为一个事件读取,因此即使包含多个对象,对象列表也显示为一行。

{"mylist":[{"name":"a","value":"val-a"},{"name":"b","value":"val-b1"},{"name":"b",  "value":"val-b2"},{"name":"c","value":"val-c"}]}

接下来,创建一个 pipeline.yaml 文件,通过指向 .log 文件的正确路径,将 logs_json.log 文件用作 source

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        key: "name"
        source: "mylist"
        value_key: "value"
        flatten: true
  sink:
    - stdout:

运行管道。如果成功,处理器将返回生成的映射,其中对象根据其 value_key 进行映射。与原始源(包含一行,因此一个事件)类似,处理器将以下 JSON 作为一行返回。为了可读性,以下示例和所有后续 JSON 示例均已调整为跨多行。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "a": "val-a",
  "b": "val-b1",
  "c": "val-c"
}

示例:映射设置为 target

以下 pipeline.yaml 示例文件显示了 list_to_map 处理器设置为指定目标 mymap 时的用法。

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        key: "name"
        source: "mylist"
        target: "mymap"
        value_key: "value"
        flatten: true
  sink:
    - stdout:

生成的映射显示在 target 键下。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "mymap": {
    "a": "val-a",
    "b": "val-b1",
    "c": "val-c"
  }
}

示例:未指定 value_key

以下 pipeline.yaml 示例文件显示了未指定 value_keylist_to_map 处理器。因为 key 设置为 name,所以处理器提取对象名称用作映射中的键。

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        key: "name"
        source: "mylist"
        flatten: true
  sink:
    - stdout:

生成映射中的值显示为来自 .log 源的原始对象,如以下示例响应所示。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "a": {
    "name": "a",
    "value": "val-a"
  },
  "b": {
    "name": "b",
    "value": "val-b1"
  },
  "c": {
    "name": "c",
    "value": "val-c"
  }
}

示例:flattened_element 设置为 last

以下 pipeline.yaml 示例文件将 flattened_element 设置为 last,从而根据每个值的最后一个元素扁平化处理器输出。

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        key: "name"
        source: "mylist"
        target: "mymap"
        value_key: "value"
        flatten: true
        flattened_element: "last"
  sink:
    - stdout:

处理器将对象 b 映射到值 val-b2,因为 val-b2 是对象 b 中的最后一个元素,如以下输出所示。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "a": "val-a",
  "b": "val-b2",
  "c": "val-c"
}

示例:flatten 设置为 false

以下 pipeline.yaml 示例文件将 flatten 设置为 false,使得处理器将生成映射中的值输出为列表。

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        key: "name"
        source: "mylist"
        target: "mymap"
        value_key: "value"
        flatten: false
  sink:
    - stdout:

响应中的某些对象的值可能包含多个元素,如以下响应所示。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "a": [
    "val-a"
  ],
  "b": [
    "val-b1",
    "val-b2"
  ],
  "c": [
    "val-c"
  ]
}

示例:use_source_keyextract_value 设置为 true

以下 pipeline.yaml 示例文件将 flatten 设置为 false,使得处理器将生成映射中的值输出为列表。

pipeline:
  source:
    file:
      path: "/full/path/to/logs_json.log"
      record_type: "event"
      format: "json"
  processor:
    - list_to_map:
        source: "mylist"
        use_source_key: true
        extract_value: true
  sink:
    - stdout:

mylist 中的对象值被提取并添加到具有源键 namevalue 的字段中,如以下响应所示。

{
  "mylist": [
    {
      "name": "a",
      "value": "val-a"
    },
    {
      "name": "b",
      "value": "val-b1"
    },
    {
      "name": "b",
      "value": "val-b2"
    },
    {
      "name": "c",
      "value": "val-c"
    }
  ],
  "name": ["a", "b", "b", "c"],
  "value": ["val-a", "val-b1", "val-b2", "val-c"]
}