16

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

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

たとえば、以下の通常のクエリについて考えてみます。

UPDATE temp1
SET location=florida
WHERE id=206;

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

4

2 に答える 2

11
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つずつ使用したことはないので、すべてのパーティションを一度に実行する前に、test /devenvで結果を確認します。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]残りの列です。それらは正しい順序である必要があります。これは非常に重要です。さもないと、データが破損します。

お役に立てれば。:)

于 2011-06-01T15:34:51.073 に答える
1

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

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

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

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

于 2013-02-25T20:01:15.003 に答える