web-dev-qa-db-ja.com

Hiveの更新、SETオプション

Hadoopにはファイルの更新がないことを知っていますが、Hiveでは、構文シュガーを使用して、新しい値をテーブル内の古いデータとマージし、マージされた出力でテーブルを書き換えることができますが、別の新しい値がある場合次に、左外部結合を使用して同じ効果を得ることができます。

私の場合の問題は、いくつかのwhere条件を持つ列に1つの値を設定してテーブルを更新する必要があることです。 SETはサポートされていないことがわかっています。

たとえば、次の通常のクエリを考えてみます。

UPDATE temp1
SET location=florida
WHERE id=206;

同じものをHiveで変換しようとしましたが、SETの代わりに行き詰まりました。誰かが私に知らせたら、それは私にとって大きな助けになるでしょう。

14
Jothi
_INSERT OVERWRITE TABLE _tableName_ PARTITION (_partitionColumn_= _partitionValue_) 
SELECT [other Things], CASE WHEN id=206 THEN 'florida' ELSE location END AS location, [other Other Things] 
FROM _tableName_ WHERE [_whereClause_];
_

複数のパーティションをコンマで区切ってリストすることができます。 ... PARTITION (_partitionColumn_= _partitionValue1_, _partitionColumn_= _partitionValue2_, ...)。複数のパーティションでこれを実行したのではなく、一度に1つだけなので、すべてのパーティションを一度に実行する前に、テスト/開発環境で結果を確認します。各OVERWRITEを単一のパーティションに制限する他の理由もありました。

このページ https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML についてもう少し詳しく説明します。
このサイト https://cwiki.Apache.org/confluence/display/Hive/LanguageManual は、一般に、HiveSQLを使用する際の親友です。

これと同じものをいくつかのデータを移行するために開発しましたが、うまくいきました。私はそれを数GBの大規模なデータセットに対して試したことがなく、完全に機能しました。

注意-これはパーティションを[〜#〜]上書き[〜#〜]します。以前のファイルをバイバイにします。バックアップと復元のスクリプト/手順を作成します。 _[other Things]_および_[other Other Things]_は、テーブルの残りの列です。それらは正しい順序である必要があります。これは非常に重要です。そうしないと、データが破損します。

お役に立てれば。 :)

10
QuinnG

これはハッキーかもしれませんが、私が仕事でしなければならなかった何かのために働いています。

    INSERT OVERWRITE TABLE tabletop PARTITION(partname = 'valueIwantToSet')
    SELECT things FROM databases.tables WHERE whereclause;

予想通り、これはデータをパーティションに分割しますが、設定する値の分布が「適切なデータチャンクサイズ」に比例している場合(これは設計者次第です)、そのデータに対するクエリはより適切になります。最適化

@Jothi:使用したクエリを投稿していただけませんか?

1
Engineiro