如何根据Elastic中的数据生成N个FlowFiles并设置每个FlowFile的内容?

时间:2017-09-07 15:53:06

标签: elasticsearch apache-nifi elasticsearch-5

在Elasticsearch中我有这个索引和映射:

PUT /myindex
{
  "mappings": {
    "myentries": {
      "_all": {
        "enabled": false
      }, 
      "properties": {
          "yid": {"type": "keyword"},
          "days": { 
              "properties": {
                        "Type1":  { "type": "date" },
                        "Type2":  { "type": "date" }
              }
            },
            "directions": { 
              "properties": {
                      "name": {"type": "keyword"},
                      "recorder":  { "type": "keyword" },
                      "direction":  { "type": "integer" }
              }
            }
        }
    }
  }
}

我想为映射recorderdirectiondirections的每个值组合生成N个FlowFiles,1。我怎么能在Nifi中做到这一点?我正在考虑使用GenerateFlowFile,但是如何应用与Elasticsearch相关的逻辑?

一种可能的解决方法可能是使用GenerateFlowFile生成N个FlowFiles,其中Batch字段可以硬编码并设置为10(Elastic中的条目数)。但后来我不知道下一步应该是什么?

1 个答案:

答案 0 :(得分:1)

GenerateFlowFile可能不是正确的工具,因为它不接受传入的连接,因此您无法使用计数对其进行参数化。您可以使用SplitJson,它会将流文件拆分为多个流文件,给定一个 JSONPath 表达式,该表达式从JSON内容返回一个数组。

<强>更新

这是一个great tool,您可以使用它来动态评估JSONPath并查看它匹配的内容。在您的示例中,我们假设您收到了以下数据:

{
  "yid": "nifi",
  "days" : [{"Type1": "09/07/2017"},{"Type2":"10/07/2017"}],
  "directions": [
    {
        "name": "San Francisco",
      "recorder"  : "Samsung",
      "direction": "0"
    },
    {
        "name": "Santa Monica",
      "recorder"  : "iPhone",
      "direction": "270"
    },
    {
        "name": "San Diego",
      "recorder"  : "Razr",
      "direction": "180"
    },
    {
        "name": "Santa Clara",
      "recorder"  : "Android",
      "direction": "0"
    }
  ]
}

JSONPath表达式$.directions[*].direction将返回:

[
  "0",
  "270",
  "180",
  "0"
]

这将允许SplitJson创建四个包含派生内容和fragment属性的流文件,以将它们关联回原始流文件。

如果您确实需要在结果方向上执行排列逻辑&amp;记录器值,您可能希望使用ExecuteScript和一个简单的Groovy / Ruby / Python脚本来内联执行该操作并拆分结果值。