如何在NiFi的flowfile中映射列明智的数据?

如何在NiFi的flowfile中映射列明智的数据?

问题描述:

我有具有以下结构的CSV文件。,如何在NiFi的flowfile中映射列明智的数据?

Alfreds,Centro,Ernst,Island,Bacchus 
Germany,Mexico,Austria,UK,Canada 
01,02,03,04,05 

现在我有该数据移动到数据库等的下方。

Name,City,ID 
Alfreds,Germay,01 
Centro,Mexico,02 
Ernst,Austria,03 
Island,UK,04 
Bacchus,Canda,05 

我试图映射那些colums,但我无法在列明智中提取数据。在列

这里我输入数据明智的,但我需要插入SQLServer的那些行明智

任何人都可以建议的方式来逐列数据传输到列在SQL Server明智?

谢谢

@Andy,

它可以在NiFi可能还没有使用ExecuteScript。

我已经提取了3个输入行作为input.1,input.2,input.3在ExtractText中。然后使用expression language中的AnydelinateValues计算“input.1”中的列数,并将其存储在“TotalCount”属性中。

最初做成“Count = 1”。

使用循环概念,通过使用“计数”,然后递增,以获得第一列“计数”检查“计数”在RouteOnAttribute “乐(TOTALCOUNT)”

现在形成插入查询“计数”属性。

它对我很好,它可能对某人有用。

+1

这将不能很好地扩展并将流文件的全部内容加载到堆空间 - 具有数千行的流文件可能会溢出堆。 – Andy

+0

是的,它占用堆空间。对于大规模的这些方法不适用它会影响堆内存。 –

没有现有的Apache NiFi处理器来执行列转置。其中一个问题是,由于大多数NiFi组件都是设计的,所以这很难以流式传输的方式进行,因为在天真的实现中,您需要将流文件的全部内容同时保存在活动内存中。

我会推荐使用ExecuteScript处理器来做到这一点(here's a 6 line Python example)。要小心这样做,因为如果设置不正确,你可能会很容易溢出堆,或者意外地将大文件读入内存。

你可以写,其通过遍历每个Ñ行和读可达您的分隔符,存储每行字节计数器,所述Ñ元件组合为单个输出行执行流转置操作一定制的处理器,并从每行的相应字节计数器开始重复该过程。 (给定m列,这是O(m * n))。

另一种解决方案将被分割CSV输入到使用SplitText处理器单独的行,使用ExecuteScript或定制的处理器移调单行成一个单一的柱,然后使用自定义合并操作(延伸现有MergeContent处理器或写一个脚本来做到这一点),它将输入列横向连接成一个重构矩阵。 (O(n) + O(n) + O(m) =>O(2n + m),但个别转置操作可以并行执行,因此x线程它的O(n + n/x + m))。

任何这些方法都需要一定程度的自定义开发。如果您真的很犹豫,可以尝试使用ExecuteStreamCommandmany bash solutions之一在命令行上进行转置。