如何在NiFi中映射流文件中的列式数据?

时间:2017-03-02 05:03:01

标签: sql sql-server apache-nifi

我有csv文件,其中包含以下结构。

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

我尝试映射这些列,但我无法按列提取数据。

这里我的输入数据是列式的,但我需要在SQLServer中以行方式插入

有人可以建议在sql server中按列方式传输列式数据吗?。

由于

2 个答案:

答案 0 :(得分:1)

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

我建议使用ExecuteScript处理器执行此操作(here's a 6 line Python example)。小心这样做是因为如果没有正确设置/你将意外的大文件读入内存,你很容易就会溢出堆。

您可以编写一个自定义处理器,通过遍历每个 n 行并读取分隔符来执行流式转置操作,每行存储一个字节计数器,并结合 n < / em>元素作为单个输出行,并从每行的相应字节计数器开始重复该过程。 (给定 m 列,这是O(m * n))。

另一种解决方案是使用SplitText处理器将CSV输入拆分为单独的行,使用ExecuteScript或自定义处理器将单行转置为单个列,然后使用自定义合并操作(扩展现有的MergeContent处理器或编写一个脚本来执行此操作),将传入的列横向连接到重构矩阵中。 (O(n) + O(n) + O(m) =&gt; O(2n + m),但各个转置操作可以并行执行,因此 x 线程是O(n + n/x + m))。

这些方法中的任何一种都需要一定程度的自定义开发。如果您真的对此犹豫不决,可以尝试使用ExecuteStreamCommand和其中一个many bash solutions在命令行上进行转置。

答案 1 :(得分:1)

@Andy,

在NiFi中也可以不使用ExecuteScript。

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

最初制作&#34; Count = 1&#34;。

使用Loop Concept通过使用&#34; Count&#34;来获取第一列。然后递增&#34; Count&#34;检查&#34;计数&#34;在RouteOnAttribute中 &#34;乐(TOTALCOUNT)&#34;

现在使用&#34; Count&#34; 属性表单插入查询。

它对我有用。对某人有用。