2016-05-09 8 views
1

私は簡単な質問があります。私は外部のSQLデータベースが更新された場合、変更は私のデータフレームに反映されますか、私は再びデータフレームを取り込むために、ロード機能を呼び出す必要が知りたいと思ったスパークSQLからのスパーク外部ソースが自動的に更新されます

Map<String, String> options = new HashMap<String, String>(); 
options.put("url", "jdbc:postgresql:dbserver"); 
options.put("dbtable", "schema.tablename"); 

DataFrame myDF= sqlContext.read().format("jdbc"). options(options).load(); 

を使用して、データの大extrenalソースをロードしています。

ロード機能をもう一度呼び出す必要がある場合は、外部ソースが変更されたときにデータフレームを更新できるSparkで効率的な方法がありますか?

答えて

0

短い答えはありませんが、細部は比較的微妙です。一般的に、Sparkではイベントがデータベースの一貫した状態を保証することはできません。各エグゼキュータは別個のトランザクション内でデータの独自の部分をフェッチします。したがって、データがアクティブに変更されても、エグゼキュータすべてが同じ状態のデータベースを参照する保証はありません。

これは、明示的および暗黙的な(シャッフルファイル)キャッシング、およびエグゼキュータの可能性のある失敗とキャッシュエビクションを考慮するとさらに複雑になります。したがって、データベースの一貫したビューが必要な場合は、モデルとクエリの両方でサポートする必要があります。一般的には、データソースは一貫したポイントインタイムクエリをサポートする必要があり、Sparkから実行するすべてのクエリは特定のタイムスタンプを使用する必要があります。

最後の質問は、あなたのユースケースについての詳細を知らなくても答えることは本当に難しいですが、少なくとも二つの問題があります。

  • スパークデータ構造は非常によく、小さな増分更新のために適していません。スケジューリングのコストが比較的高いと増分組合が長い系統のようなさまざまな問題や複雑なパーティション管理
  • を紹介しているデータベースを監視するベンダーに依存する方法はありませんが
を変更します
関連する問題