2017-03-28 10 views
0

NiFiを使用して同様の構造のテーブルを使用して2つのデータベース間でデータを転送しようとしています。データ構造の例:Apache NiFiフローによるデータベースレコードの挿入または更新

User: {varchar name, integer id}. 

"最大値列"がないため、新しいデータがあるかどうかを判断することはできません。だから毎回私は完全なテーブルのコンテンツの "スナップショット"を作成します。問題は、特定のレコードをターゲット・データベースに挿入または更新する必要があるかどうかが不明であることです。

2つのプロセッサブランチを作成しました。挿入と更新があります。新しいレコードには挿入のみが機能し、既存のレコードは更新されます。しかし、(!)PutSQLプロセッサは、一連のフローファイルで動作します。 たとえば、バッチサイズは100で、プロセッサは1日に1回しか動作しません。昨日、98レコードがあったとします。それらは挿入されます。今日は200レコード(昨日から98、新しい102)があります。このフローでは、NiFiが最初の100レコードを更新して挿入しようとすると、両方のアクションが失敗します。最初の98レコードは更新され、最後の2レコードが挿入されます。

この問題を解決するにはどうすればよいですか?私はそれがバッチサイズ1を使用することは可能ですが、それはあまりにも遅く動作することがわかります。

答えて

0

NiFiはレコードの以前のステータスを知りませんので、SQL文でこれを解決することをお勧めします。データベースがサポートしている場合は、MERGE文が理想的です(OracleSQL ServerMySQL挿入)。それ以外の場合は、ソース表の各レコードに対してINSERTとUPDATEの両方を作成し、表に存在するユーザーに対して条件付きにすることができます。

関連する問題