2016-07-29 5 views
1

私はハイブを使用してSQLベースのデータウェアハウジング活動を実装する必要があるユースケースを持っています。ハイブベースのデータウェアハウジングタスク - レコードにシーケンス番号を追加

このソフトウェアは、csvファイルの束を生成します。 SQLテーブルに変換するとき、セッションと呼ばれる一意のIDが各csvファイルに割り当てられ、SQLテーブルにロードされます。たとえば、csvファイルに3列あります。 SQLテーブルに4つの列があり、最初の列はセッションを表します。つまり、最初のcsvファイルに格納されている値は、sessios id '1'を持つSQLテーブルに書き込まれ、2番目のcsvファイルの値は、セッションID '2'を持つSQLテーブルに追加されます。ハイブの

私はHDFSディレクトリにこれらのCSVファイルを保存し、セッションIDを表し、追加の列と1つのハイブのテーブルを作成します。私はどのようにそれを行うことができるか分かりません。どんな助けや手がかりも高く評価されます。

+0

追加の列なしでテーブルを作成できますか?どのようにIDは何であるべきか、コンピュータはどのように知っていますか?ファイルを読み込むときにタグファイルフラグを使用することを検討しましたか(つまり、IDを追加するのではなく、ファイル名を列として追加します) –

+0

これは良い提案です。 id。しかし、私は自分のHQLクエリを書くとき、私は複数のテーブルからいくつかの値を選びます。その場合、INPUT__FILE__NAMEが複数のテーブルに存在するというエラーが表示されます。ここで回避策はありますか? – Bala

+0

私はそれを修正しました。私の質問では単純な間違いでした。私は質問でDISTINCTを見逃しました。ありがとう。私はまだどのセッションが処理され、どのセッションが処理されないのかを追跡するために、セッションを別のテーブルに格納する必要があります。私は別のテーブルの助けを借りてそれを行います。 – Bala

答えて

0

近づい以下試してみてください。

をランダムセッションIDを使用して:

  • ソースデータセットの上に外部表を作成:

create external table staging (a string, b string, c string) location 'xyz';

  • 各行に一意のIDを割り当てる:
  • セッションIDとしてシーケンス番号を使用して

insert into table destination as select reflect("java.util.UUID", "randomUUID") AS session_id, s.* from staging;

  • ソースデータセットの上に外部表を作成する:

create external table staging (a string, b string, c string) location 'xyz';

  • 初めてデータロード:

CREATE TABLE IF NOT EXISTS max_session_id (session_id int);

  • 各レコードにシーケンス番号を追加:

insert into table destination select cast(coalesce(t.session_id,0) + row_number() over() as INT) as session_id, t1.* from max_session_id t join destination t1 on 1=1;

  • は別のテーブルに最大セッションIDを更新します。

DROP TABLE IF EXISTS tmp_max_session_id; CREATE TABLE tmp_max_session_id AS SELECT COALESCE(MAX(session_id), 0) AS session_id FROM destination;

INSERT OVERWRITE TABLE max_session_id SELECT * FROM tmp_max_session_id; 

あなたは、パーティションとして各ファイルを追加するファイルごとに同じセッションIDをタグ付けしたい場合は、(「java.util.UUID」、「randomUUID」)を反映して保存することができますかパーティションを追加する際に別のテーブルのmax_session_idを新しく生成したsession_idをパーティションIDとして使用します。

+0

お寄せいただきありがとうございます。それは私のための良い学習です。ただし、レコードごとに一意のIDを割り当てる必要はありませんが、処理される各ファイルごとにシーケンス番号が必要です。 INPUT__FILE__NAMEの代わりに、私は整数を見るのが好きです。それにもかかわらず、私はあなたの意見を私の将来の必要に応えます。 – Bala

+0

2番目の方法を使用して、各ファイルのシーケンスIDを生成し、パーティションとしてテーブルに追加することができます。 –

関連する問題