Hadoopにはファイルの更新がないことを知っていますが、Hiveでは、構文シュガーを使用して、新しい値をテーブル内の古いデータとマージし、マージされた出力でテーブルを書き換えることができますが、別の新しい値がある場合次に、左外部結合を使用して同じ効果を得ることができます。
私の場合の問題は、いくつかのwhere
条件を持つ列に1つの値を設定してテーブルを更新する必要があることです。 SET
はサポートされていないことがわかっています。
たとえば、次の通常のクエリを考えてみます。
UPDATE temp1
SET location=florida
WHERE id=206;
同じものをHiveで変換しようとしましたが、SET
の代わりに行き詰まりました。誰かが私に知らせたら、それは私にとって大きな助けになるでしょう。
_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]
_は、テーブルの残りの列です。それらは正しい順序である必要があります。これは非常に重要です。そうしないと、データが破損します。
お役に立てれば。 :)
これはハッキーかもしれませんが、私が仕事でしなければならなかった何かのために働いています。
INSERT OVERWRITE TABLE tabletop PARTITION(partname = 'valueIwantToSet')
SELECT things FROM databases.tables WHERE whereclause;
予想通り、これはデータをパーティションに分割しますが、設定する値の分布が「適切なデータチャンクサイズ」に比例している場合(これは設計者次第です)、そのデータに対するクエリはより適切になります。最適化
@Jothi:使用したクエリを投稿していただけませんか?