2017-09-10 14 views
0

HiveContextでPySparkを使ってSCD1とSCD2を適用したい。私のアプローチでは、私はインクリメンタルなデータとターゲットテーブルを読んでいます。読んだ後、私はupsertアプローチのためにそれらに参加しています。すべてのソースデータフレームに対してregisterTempTableを実行しています。私は最終的なデータセットをターゲットテーブルに書き込もうとしています。読み込まれたテーブルに上書きを書き込むことができないという問題に直面しています。Spark HiveContext:Insert読み込んだ同じテーブルを上書きする

解決策をご提案ください。私は中間のデータを物理的な表に書き込んで、それを再び読みたいとは思わない。

任意のプロパティまたはそれから読み込まれ、テーブルの上に依存関係を維持することなく、最終的なデータセットを保存する方法はあります。このようにして、テーブルを上書きすることができます。

お勧めします。

+1

をターゲットに移動するためにHDFS I/Oを使用することができます。 Spark Contextを停止してから、上書きを実行して新しいテーブルを削除してください。 –

+0

ありがとうございます!しかし、私は物理的なテーブルを使わずにそれをやりたかったのです。ソーステーブルから依存関係を取り除く方法はありますか?そのような解決策があれば、永続化またはキャッシュのようなものがあります。 –

+0

ソーステーブルをキャッシュすることはできますが、メモリに完全に収まる必要があります –

答えて

0

私は、スパークのドキュメントを通過して、私はそこに一つの特性をチェックしていたときに考えたのは私にはクリックされました。

私のテーブルには、寄木細工だったので、私は、このプロパティをfalseに設定することで、データを読み取るためにハイブメタストアを使用。

hiveContext.conf("spark.sql.hive.convertMetastoreParquet","false") 

この解決策は問題なく機能しています。

+0

あなたは否定投票の前にチェックしましたか?私はそれを使用しており、私のプロジェクトでうまくいきます。データが破損することはありません。これはテキストファイルでうまく動作します。問題は寄木張りでしかなかった。私はそれを解決した。 –

0

読んでいるテーブルを上書きしないでください。データ破損と障害発生時の完全なデータ消失の間に何かが生じる可能性があります。

正しく実装SCD2は、テーブル全体を上書きすることはありませんべきではないと(主に)追加の操作として実装することができることを指摘することも重要です。私が知る限り、SCD1は変更可能なストレージなしで効率的に実装できないため、Sparkには適していません。

0

データフレームは、挿入があなたの問題を解決するためにオプションの下に使用することができ、同じ場所や同じテーブルに上書きすることができません。

  1. 実行ハイブジョブデータはそのパーティションに壊れてしまいますので、失敗した場合 は非常に気をつけなり、失敗した場合に火花/ hivecontextが、問題 に上書きクエリを挿入します。
  2. 他のオプションは、ジョブが完了したら一時表に保存し、ターゲット表に上書きします。
  3. それでもプログラムで使用したい場合は、TMPの場所にデータフレームを保存し、新しいテーブルを作成し、パーティション 場所
関連する問題