如何根据SQL查询的结果过滤流文件?

时间:2018-09-25 14:57:46

标签: apache-nifi

是否可以根据返回单行结果的SQL查询的结果来路由流文件?例如,如果结果为“ 1”,则将处理流文件;否则,将处理流文件。否则,它将被忽略。

解决方案

以下方法最适合我。

  1. 使用 ExecuteSQL 处理器来运行过滤SQL查询。查询被编写为以Shu提出的方式生成单个记录(匹配)或空记录集(不匹配)。
  2. ExecuteSQL 连接到 RouteOnAttribute 处理器,以便使用以下路由属性值${executesql.row.count:replaceNull(0):gt(0)}
  3. 来过滤出不匹配的流文件

通知,当应用 ExecuteSQL 后,流文件的原始内容将丢失。就我而言,这不是问题,因为我在处理流文件内容之前进行了过滤,而我的SQL查询完全基于流文件属性而不是其内容。尽管在更一般的情况下,当流的文件内容被流的传入部分修改时,应将文件内容保存在某处(例如文件系统),并在应用过滤部分后将其还原。

1 个答案:

答案 0 :(得分:1)

您可以在SQL查询where <field_name> = 1添加where子句,然后,当结果值= 1时,我们只会输出流文件

(或)

在NiFi中检查数据:

作为SQL查询的结果,我们将具有 AVRO 格式的数据,以便您可以使用

  

选项1:ConvertAvroToJson处理器:

AVRO 数据转换为 JSON 格式,然后使用EvaluateJsonPath处理器从 json内容中提取值作为属性。

然后使用 RouteOnAttribute 处理器使用NiFi expression language equals function比较新属性并将流文件路由到匹配的关系。

请参阅this链接,以获取有关EvaluateJsonpath和RouteOnAttribute处理器配置的更多详细信息。

  

选项2:使用QueryRecord处理器:

通过使用 QueryRecord 处理器,我们可以对流文件的内容运行 SQL查询

为处理器添加新属性

select * from FLOWFILE where <filed_name> =1 

将属性关系提供给另一个处理器

有关查询记录处理器使用情况的更多详细信息,请参见this链接。