2016-11-05 8 views
0

Oracleデータベースがあり、データをハイブテーブルにインポートする必要があります。毎日のインポートデータサイズは約1 GBです。よりよいアプローチは何でしょうか?私はパーティションとして、毎日のデータをインポートする場合sqloopを使用してRDBMSからhive/hadoopにデータを段階的にインポートする

、どのように更新された値を処理することができますか?例えば

私はパーティションとして、翌日のために、今日のデータをインポートした場合、新しい値で更新されているいくつかのフィールドがあります。 --lastmodifiedを使用して

我々は値を取得することができますが、我々は新しいパーティションまたは古い(既存の)パーティションに更新された値を送信する必要がどこ?

私は新しいパーティションに送信する場合、そのデータが複製されます。 既に存在するパーティションに送信したい場合、どのように達成できますか?

答えて

0

あなたの唯一のオプションはで全体の既存のパーティションを上書きすることである「INSERT上書きTABLE ...」。
質問です - データを常に更新していくまでにどれくらい前に戻るのですか?
私はuが考えることができます3つのアプローチを考える:

  • は「新鮮な」データのためのしきい値を決定します。例えば、「14日後ろ」または「1月後ろ」などです。
    次に、ジョブを実行している毎日、しきい値が決定するまで、パーティションを上書きします(値が更新されたパーティションのみ)。
    1日あたり〜1GBで実現可能です。
    決められた時間前のすべてのデータは、100%正確であるとは限りません。
    このシナリオは、フィールドが最初に設定された後に特定の時間枠のみを変更できることがわかっている場合に関係します。
  • ハイブテーブルをACIDトランザクションと互換性があるようにして、テーブルの更新を許可します。
    毎日のジョブを2つのタスクに分割します。新しいデータは実行日に書き込まれます。後で実行する必要がある更新されたデータsqoopは新しいデータを担当します。更新されたデータを '手動で'処理する(更新ステートメントを生成するスクリプト)
  • 時間に基づいてパーティションを使用しないでください。ダイナミックパーティショニングがユースケースに適しているかもしれません。処理されるデータの性質によって異なります。
+0

ありがとうBelostokyは、あなたは問題がダイナミックパーティションを使用して解決方法にelobarateしてくださいすることができます。 – Raj

+0

日付でパーティション化するのではなく、値のセット(たとえばcountries/device_type/network_type)をバインドした他のフィールドでパーティションを作成する場合は、次の構文を使用できます:INSERT OVERWRITE TABLE your_table PARTITION(part1、part2)... :https://cwiki.apache.org/confluence/display/Hive/Tutorial-Tutorial-Dynamic-PartitionInsert – belostoky

関連する問題