2017-03-02 26 views
2

我有具有以下結構的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明智?

謝謝

回答

1

@Andy,

它可以在NiFi可能還沒有使用ExecuteScript。

我已經提取了3個輸入行作爲input.1,input.2,input.3在ExtractText中。然後使用expression language中的AnydelinateValues計算「input.1」中的列數,並將其存儲在「TotalCount」屬性中。

最初做成「Count = 1」。

使用循環概念,通過使用「計數」,然後遞增,以獲得第一列「計數」檢查「計數」在RouteOnAttribute 「樂(TOTALCOUNT)」

現在形成插入查詢「計數」屬性。

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

+1

這將不能很好地擴展並將流文件的全部內容加載到堆空間 - 具有數千行的流文件可能會溢出堆。 – Andy

+0

是的,它佔用堆空間。對於大規模的這些方法不適用它會影響堆內存。 –

1

沒有現有的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之一在命令行上進行轉置。

相關問題