2017-11-01 39 views
1

置換テキストプロセッサを使用して、区切り文字としてカンマ(、)を付ける44列ファイルのいくつかの列を置き換えます。NiFi置換テキスト処理で、n番目の列を属性値で置き換えようとするとエラーが発生する

1つのフローファイルには1つの行と44個のフィールドがあります。置き換えるテキストプロセッサで

enter image description here

私は属性を持つフローファイルで3番目の列を変更する必要があります。 私はそれを4つのグループに分け、2番目のグループのデータだけを属性に置き換えました。

これを行うとプロセッサがハングします。 n番目の列を特定の属性または文字列に置き換えるにはどうすればよいですか?

答えて

2

どのNiFiのバージョンをお使いですか? NiFi 1.3.0以降、UpdateRecordなどの「レコード対応」プロセッサを使用できます。可能であれば、CSVReaderを設定します。ヘッダー行から文字列フィールドを推測するか、フィールドに独自のAvroスキーマを指定します。目的の列/フィールドの名前が "fname"であるとします。 UpdateRecordでは、置換戦略を "Literal"に設定し、 "$ {filename}"の値を持つ "/ fname"というユーザー定義プロパティを追加できます。これにより、行を分割したり、正規表現を処理して行を解析したりすることなく、CSVファイルをインプレースで更新することができます。

+0

スキームは時折変更される場合があります。だからこそ、私はアップデート・レコード・プロセッサーを使いたくなかったのです。しかし、私はそれをあなたの返信に感謝します。@mattyb – user4321

+1

レコード対応のプロセスはスキーマの移行を考慮して設計されており、正規表現よりも保守性が高いはずです。 – mattyb

1

注:ApacheのNiFi 1.3.0+のバージョンを使用している場合は、Mattの方法が優れている

私の推薦はExecuteScriptプロセッサを使用して、これを行うためにGroovyのを使用することです。私はあなたが最終的にあなたが探しているものと一致する正規表現を作ることができると信じていますが、あなたが注意しているように、パフォーマンスは良くならないでしょう、そして、より大きいフローファイルが入ったら、ヒープをクラッシュさせるかもしれません。 Groovyで

、これがそうのような単純な文字列置換操作だろうが(やPython/Rubyのは/ etc。):

import org.apache.commons.io.IOUtils 
import java.nio.charset.* 

def flowFile = session.get() 
if(!flowFile) return 

flowFile = session.write(flowFile, {inputStream, outputStream -> 
    def elements = IOUtils.toString(inputStream, StandardCharsets.UTF_8).split(",") 
    // Rather than hardcoding, you could make the column index also read from a flowfile attribute to make this more generic 
    elements[2] = flowfile.getAttribute("myAttributeName") 
    def outputString = elements.join(",") 

    outputStream.write(outputString.getBytes(StandardCharsets.UTF_8)) 
} as StreamCallback) 

session.transfer(flowFile, REL_SUCCESS) 
関連する問題