NiFi将记录插入表后创建索引

时间:2019-04-02 20:47:03

标签: apache-nifi

我有我的第一个处理组,该处理组将表中的索引删除。 然后路由到确实插入表中的另一个进程组。 成功插入五十万行之后,我想在表上创建索引并进行分析。这是典型的数据仓库方法。谁能给我建议如何做到这一点?

我尝试设置计数器,但是无法在“表达式语言”中引用计数器。我已经尝试过RouteOnAttribute但没有成功。现在,我正在研究“等待并通知处理器”-也许那里有解决方案?

我已经获得了计数器来对流文件sql插入语句进行计数,但是无法通过表达式语言引用计数器值。即,此操作始终返回null:“ $ {InsertCounter}”,在其中正确设置了InsertCounter的情况下,它通过我的UpdateCounter进程显示在流程中。

那么也许可以使用此代码?

在等待处理器中,将目标信号计数设置为$ {fragment.count}。

在通知和等待处理器中将释放信号标识符设置为$ {fragment.identifier}

没有任何作用

2 个答案:

答案 0 :(得分:1)

您可以使用“等待/通知”处理器来执行此操作。 我假设您正在使用ExecuteSQL,SplitAvro?如果是这样,则流程将如下所示:

分割方法

在第二个进程组中

  • ExecuteSQL:例如1个输出FlowFile包含5,000条记录
  • SpritAvro:创建5,000个FlowFile,此处理器添加fragment.identifierfragment.count(= 5,000)属性。
    • 分割:
      • XXXX:每条记录进行一些转换
      • PutSQL:分别插入记录
      • 通知:将fragment.identifier(发布信号标识符)的计数增加1。已执行5,000次。
    • 原始-到下一个ProcessGroup

在第三个进程组中

  • 等待:等待fragment.identifier(发布信号标识符)达到fragment.count(目标信号计数)。此路由处理original FlowFile,因此仅执行一次。
  • PutSQL:执行查询以创建索引并分析表

或者,如果可能的话,使用具有记录意识的处理器将使流程更简单,更高效。

记录方法

  • ExecuteSQL:例如1个输出FlowFile包含5,000条记录
  • 执行记录级别转换:使用UpdateRecord或LookupRecord,您可以执行数据处理而无需将记录拆分为多个FlowFiles。
  • PutSQL:执行查询以创建索引并分析表。由于单个FlowFile包含所有记录,因此不需要等待/通知,因此输出FlowFile可以连接到下游流。

答案 1 :(得分:0)

我想我对这个问题的建议也将适合您的情况

How to execute a processor only when another processor is not executing?

签出