在NiFi数据流中,如果我想根据特定字段的值将单个流文件分成两组,那么就性能而言,以下列方式使用QueryRecord或PartitionRecord是否更快?

QueryRecord:

SELECT * FROM FLOWFILE WHERE WEIGHT < 1000;

分区记录


在RecordPath模式下的UpdateRecord中,使用greater_or_less的值填充新的“字符串”字段/weight
在文字值模式下的UpdateRecord中,将greater_or_less更新为${field.value:toNumber():lt(1000)}
PartitionRecord分区中,将greater_or_less上的流文件


在PartitionRecord方法中,我将具有两个模式,一个模式是原始数据格式,另一个模式除了原始数据格式外还具有greater_or_less字段。我们将在原始模式中开始步骤1,在新模式中从步骤1输出,然后在原始模式中输出步骤3。步骤3的输出应为两个流文件,其中一个等效于QueryRecord方法的输出。

总而言之,尽管QueryRecord的实现比较简单,但是我对NiFi的后端机制或这些处理器的开销相比没有任何了解,因此我不确定哪种方法是最佳的。我的直觉告诉我QueryRecord是昂贵的,但是我不确定它与PartitionRecord方法的类型转换和记录读写的比较。

最佳答案

我不知道哪一个更快,但都可以在Apache Calcite的后台运行,这非常快。
您是否考虑过使用GenerateFlowfile生成测试数据并进行尝试?

我希望PartitionRecord是最好的,但是请使用filter with a predicate而不是使用UpdateRecord在架构中生成新字段。

09-27 15:53