我在列出数据库中的表后执行了一系列查询,基本上是在添加了一些智能的数据库转储中。
当数据来自ExecuteSql
处理器时,它采用Avro格式。我可以使用ConvertAvroToJson
来转换为JSON。然后我可以将JSON发送到其他地方。太好了!
但是,我需要在该JSON文档中嵌入更多信息。我极少想要:
UpdateAttributes
处理器中的硬编码 ExecuteSQL
似乎没有提供此信息,只有it does seem to copy attributes from the input flowfile。我可以通过管道中的UpdateAttributes
将一些此类信息放入输入流文件属性中。如果可能,我如何将ExecuteSQL -> ConvertAvroToJSON
的JSON输出与AttributesToJson
处理器的可行输出属性合并?
答案 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感兴趣。