如何将起源信息与NiFi中的ExecuteSQL结果相关联?

时间:2018-01-08 21:15:08

标签: apache-nifi

我在列出数据库中的表后执行了一系列查询,基本上是在添加了一些智能的数据库转储中。

当数据来自ExecuteSql处理器时,它采用Avro格式。我可以使用ConvertAvroToJson来转换为JSON。然后我可以将JSON发送到其他地方。太好了!

但是,我需要在该JSON文档中嵌入更多信息。我极少想要:

  1. 执行查询的表的名称
  2. 数据库DSN(没有凭据,可能硬编码到配置中,因为我认为它不能从NiFi表达式语言字段访问),
  3. 执行生成记录的查询
  4. 查询集中的记录号(总行数已经是属性)。
  5. 从环境变量或配置文件中提取的任意信息,然后回退到UpdateAttributes处理器中的硬编码
  6. ExecuteSQL似乎没有提供此信息,只有it does seem to copy attributes from the input flowfile。我可以通过管道中的UpdateAttributes将一些此类信息放入输入流文件属性中。如果可能,我如何将ExecuteSQL -> ConvertAvroToJSON的JSON输出与AttributesToJson处理器的可行输出属性合并?

1 个答案:

答案 0 :(得分:2)

几条评论:

1)您是先使用ListDatabaseTables吗?如果是这样,您将在流文件中拥有属性,包括表名,数据库名等。

2)此信息当前不可用于处理器,DBCPService API仅公开JDBC Connection。也许您可以使用像ExecuteScript这样的脚本处理器来执行SQL(我在my blog上有一个示例)并获取对元数据的访问权限,但我不确定它是否具有您想要的所有信息。此处理器的出处也没有这些信息,因为我们没有为来源事件存储Transit URI。我们应该考虑至少使处理器可以使用Transit URI(减去敏感值)。

3)如果您在ExecuteSQL处理器中对SQL查询进行硬编码,您也可以事先使用UpdateAttribute将其硬编码到属性中。如果流文件包含SQL查询,则可以使用ExtractText将其放入属性中。我们还应该增强处理器以将查询添加为属性(必须是可选的,因为某些查询可能非常大)。

4)您是否希望将每个记录拆分为“行号”作为属性?在SplitAvro之后,您将拥有一个fragment.index属性,该属性将是与每条记录关联的从零开始的数字。

5)您可以在UpdateAttribute中使用表达式语言,因此结合Variable Registry,您可以从环境变量或注册表文件中读取值。您可能也对PropertiesFileLookupService感兴趣。