2017-06-22 11 views
0

sparkを使用して大きなリレーショナル表の内容をコピーし、パーキング形式(区切りなし)でパーティション化されたハイブ表に書き込む最もメモリ効率のよい方法は何でしょうか。私は基本的なスパークのアプリを持っていると私はスパークのjdbcでいくつかの他の調整を行っているが、リレーショナルテーブルのデータはまだ0.5 TBと20億レコードですので、私は全テーブルを怠惰に読み込むことができますが、メモリの問題にぶつかることなく日付でパーティションを作成し、hdfsに保存します。 jdbc load()がsparkからすべてをメモリにロードするので、データベースクエリの日付をループすることを考えていましたが、メモリが不足していないことを確認する方法がまだわかりません。スパークとJDBC:大きな表を繰り返してhdfsに書き込む

答えて

0

Sparkを使用する必要がある場合は、アプリケーションにdateというパラメータを追加して日付ごとにテーブルをフィルタリングし、Sparkアプリケーションを日付ごとにループで実行できます。このループには、bashやその他のスクリプト言語を使用できます。

これはのようになります。

  • 日付でforeachの日
    • ​​dateパラメータ
    • と、アプリケーションがfilter方法
    • を使用してdateによりspark.read.jdbc
    • フィルタでDBテーブルを読みますHDFSに結果を0で書き込み

別のオプションは、行を反復処理し、HDFSにつながる保存するJDBCおよびDBカーソルを使用してScalaのアプリケーションを実装、例えば、異なる技術を使用することです。 Scalaを使用してParquetフォーマットへの書き込みやHDFSへの保存に関する問題を解決する必要があるため、これはより複雑です。私が望むのであれば、私はParquetフォーマットへの書き込みを担当するScalaコードを提供することができます。

+0

しかし、もし私が日付の配列をループし、それらの日付を通して 'jdbc.read'をループしても、連続した' load() '文でメモリを連続的に埋め続けるのではないでしょうか。何か? – horatio1701d

+0

私はこのループをスクリプト言語、例えばbashで実行してSparkアプリケーションを無効にすることを意味するので、Scalaでこのループを実装することを意味するわけではありません。 –

+0

は意味があります。ありがとうございました。 – horatio1701d

関連する問題