我有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中按列方式传输列式数据吗?。
由于
答案 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; 属性表单插入查询。
它对我有用。对某人有用。