74

Hadoop、Hive、Hive JDBC をインストールしました。私にとってはうまくいっています。しかし、私にはまだ問題があります。MySQLの削除または更新コマンドがHiveで機能しないため、Hiveを使用して単一のレコードを削除または更新する方法。

ありがとう

hive> delete from student where id=1;
Usage: delete [FILE|JAR|ARCHIVE] <value> [<value>]*
Query returned non-zero code: 1, cause: null
4

15 に答える 15

74

Hive を通常の RDBMS と考えるべきではありません。Hive は、非常に大きな不変データ セットのバッチ処理に適しています。

以下は、Hive 0.14 より前のバージョンに適用されます。それ以降のバージョンについては、 ashtoniumによる回答を参照してください。

特定のレコードまたは特定のレコードのセットの削除または更新に対してサポートされている操作はありません。これは、スキーマが不十分であることを示しています。

公式ドキュメントで見つけることができるものは次のとおりです。

Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
incur substantial overheads in job submission and scheduling. As a result -
latency for Hive queries is generally very high (minutes) even when data sets
involved are very small (say a few hundred megabytes). As a result it cannot be
compared with systems such as Oracle where analyses are conducted on a
significantly smaller amount of data but the analyses proceed much more
iteratively with the response times between iterations being less than a few
minutes. Hive aims to provide acceptable (but not optimal) latency for
interactive data browsing, queries over small data sets or test queries.

Hive is not designed for online transaction processing and does not offer
real-time queries and row level updates. It is best used for batch jobs over
large sets of immutable data (like web logs).

この制限を回避する方法は、パーティションを使用することです。ID が何に対応するかはわかりませんが、 IDの異なるバッチを個別に取得している場合は、ID でパーティション分割されるようにテーブルを再設計してから、削除したい ID のパーティションを簡単に削除できます。

于 2013-07-23T14:08:27.950 に答える
23

はい、当然のことです。Hive は UPDATE オプションをサポートしていません。ただし、次の代替手段を使用して結果を得ることができます。

次のレコードを更新しますpartitioned Hive table

  1. メイン テーブルは、何らかのキーによって分割されていると想定されます。
  2. 増分データ (更新するデータ) を、メイン テーブルと同じキーで分割されたステージング テーブルに読み込みます。
  3. LEFT OUTER JOIN以下の操作を使用して、2 つのテーブル (メイン テーブルとステージング テーブル) を結合します。

    insert overwrite table main_table partition (c,d) select t2.a, t2.b, t2.c,t2.d from staging_table t2 left outer join main_table t1 on t1.a=t2.a;

上記の例では、main_table&はキーstaging_tableを使用して分割されてい(c,d)ます。テーブルは を介し​​て結合LEFT OUTER JOINされ、結果はOVERWRITEのパーティションに使用されmain_tableます。

同様のアプローチは、操作の場合にも使用できます。un-partitioned Hive table UPDATE

于 2014-03-10T05:57:23.017 に答える
12

回避策を使用してテーブルから行を削除できます。この回避策では、操作の結果としてテーブルに残したいデータセットでテーブルを上書きします。

insert overwrite table your_table 
    select * from your_table 
    where id <> 1
;

この回避策は、主に簡単に識別できる行を一括削除する場合に役立ちます。また、明らかにこれを行うとデータが台無しになる可能性があるため、テーブルのバックアップをお勧めし、「削除」ルールを計画する際にも注意してください。

于 2014-09-30T10:08:34.863 に答える
4

INSERT、UPDATE、DELETE に設定する構成値 上記の新しいパラメータに加えて、INSERT ... VALUES、UPDATE、および DELETE をサポートするために、いくつかの既存のパラメータを設定する必要があります。

構成キー に設定する必要があります

hive.support.concurrency true (default is false) hive.enforce.bucketing true (default is false) (Not required as of Hive 2.0) hive.exec.dynamic.partition.mode nonstrict (default is strict)

圧縮のために設定する構成値

システム内のデータが Hive ユーザー (つまり、Hive メタストアを実行するユーザー) によって所有されていない場合、Hive は圧縮を実行するためにデータを所有するユーザーとして実行する権限が必要です。ユーザーを偽装するように HiveServer2 を既にセットアップしている場合、Hive メタストアを実行しているホストから Hive がユーザーを偽装する権利を持っていることを確認するだけです。これは、Hadoop の core-site.xml ファイルの hadoop.proxyuser.hive.hosts にホスト名を追加することによって行われます。これをまだ行っていない場合は、プロキシ ユーザーとして機能するように Hive を構成する必要があります。これには、Hive メタストアを実行しているユーザーのキータブを設定し、hadoop.proxyuser.hive.hosts と hadoop.proxyuser.hive.groups を Hadoop の core-site.xml ファイルに追加する必要があります。

UPDATE ステートメントには次の制限があります。

WHERE 句の式は、Hive SELECT 句でサポートされている式である必要があります。

パーティションとバケットの列は更新できません。

UPDATE ステートメントでは、クエリのベクトル化は自動的に無効になります。ただし、更新されたテーブルは、ベクトル化を使用して引き続きクエリできます。

サブクエリは、SET ステートメントの右側では許可されていません。

次の例は、このステートメントの正しい使用法を示しています。

UPDATE students SET name = null WHERE gpa <= 1.0;

DELETE ステートメント

DELETE ステートメントを使用して、既に Apache Hive に書き込まれたデータを削除します。

DELETE FROM tablename [WHERE expression];

DELETE ステートメントには次の制限があります。DELETE 操作では、クエリのベクトル化が自動的に無効になります。ただし、削除されたデータを含むテーブルは、ベクトル化を使用して引き続きクエリできます。

次の例は、このステートメントの正しい使用法を示しています。

DELETE FROM students WHERE gpa <= 1,0;

于 2016-12-28T09:54:33.173 に答える
3

すべてのレコードを削除する場合は、回避策として空のファイルを OVERWRITE モードでテーブルにロードします。

hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee;
Loading data to table default.employee
Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0]
OK
Time taken: 0.19 seconds

hive> SELECT * FROM employee;
OK
Time taken: 0.052 seconds
于 2015-08-25T12:53:40.643 に答える
1

現在のニーズを達成するには、以下のクエリを実行する必要があります

> insert overwrite table student 
> select *from student 
> where id <> 1;

これにより、現在のテーブルが削除され、除外/削除する行を除くすべての行を含む同じ名前の新しいテーブルが作成されます

Hive 1.2.1でこれを試しました

于 2016-10-25T06:40:16.507 に答える
0

削除は最近、Hive バージョン 0.14 に追加されました。削除は、ACID をサポートするテーブルでのみ実行できます。以下は Apache からのリンクです。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete

于 2016-05-29T06:23:35.477 に答える