web-dev-qa-db-ja.com

Hiveでレコードを削除および更新する方法

Hadoop、Hive、Hive JD BCをインストールしました。私にとっては順調です。しかし、まだ問題があります。 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
52
Charnjeet Singh

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のパーティションを簡単に削除できます。

62
Charles Menguy

Hiveバージョン0.14.0から:INSERT ... VALUES、UPDATE、およびDELETEは、ACIDを完全にサポートするようになりました。

INSERT ... VALUES構文:

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

ここで、values_rowは次のとおりです。(value [、value ...])ここで、値はnullまたは有効なSQLリテラルのいずれかです。

UPDATE構文:

UPDATE tablename SET column = value [, column = value ...] [WHERE expression]

DELETE構文:

DELETE FROM tablename [WHERE expression]

さらに、Hive Transactionsドキュメントから:

ACID書き込み(挿入、更新、削除)でテーブルを使用する場合、Hive 0.14.0以降、そのテーブルにテーブルプロパティ「transactional」を設定する必要があります。この値がないと、挿入は古いスタイルで行われます。更新および削除は禁止されます。

Hive DMLリファレンス:
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML
Hive Transactionsリファレンス:
https://cwiki.Apache.org/confluence/display/Hive/Hive+Transactions

86
ashtonium

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

partitioned Hive table:のレコードを更新

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

上書きテーブルmain_tableパーティション(c、d)を挿入し、staging_tableからt2.a、t2.b、t2.c、t2.dを選択します。

上記の例では、main_tableとstaging_tableは(c、d)キーを使用してパーティション化されています。テーブルはLEFT OUTER JOINを介して結合され、その結果はmain_tableのパーティションを上書きするために使用されます。

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

18
Sudeesh Kumar

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

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

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

6
user11788

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

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
3
Kaushik Lele

CLIはあなたの間違いがどこにあるかを教えてくれました:delete WHAT? from student ...

削除: Hadoop-Hiveからテーブルを削除/切り捨てる方法

更新: 更新、HiveのSETオプション

3
Apaachee

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ファイルに追加する必要があります。ご使用のバージョンのHadoopのセキュアモードに関するHadoopのドキュメントを参照してください(例:Hadoop 2.5.1の場合は、Hadoop in Secure Mode)。

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

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;

3
dilshad

Hiveをインストールして構成したら、単純なテーブルを作成します。

Hive>create table testTable(id int,name string)row format delimited fields terminated by ',';

次に、テストテーブルにいくつかの行を挿入してみます。

Hive>insert into table testTable values (1,'row1'),(2,'row2');

次に、テーブルに挿入したレコードを削除してみます。

Hive>delete from testTable where id = 1;

エラー!失敗:SemanticException [エラー10294]:これらの操作をサポートしないトランザクションマネージャーを使用して、更新または削除を試行します。

デフォルトでは、トランザクションはオフに設定されています。更新は、変換マネージャーで使用される削除操作ではサポートされていないと言われています。 update/deleteをサポートするには、次の構成を変更する必要があります。

cd  $Hive_HOME
vi conf/Hive-site.xml

以下のプロパティをファイルに追加します

<property>
  <name>Hive.support.concurrency</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.enforce.bucketing</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.exec.dynamic.partition.mode</name>
  <value>nonstrict</value>
 </property>
 <property>
  <name>Hive.txn.manager</name>
  <value>org.Apache.hadoop.Hive.ql.lockmgr.DbTxnManager</value>
 </property>
 <property>
  <name>Hive.compactor.initiator.on</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.compactor.worker.threads</name>
  <value>2</value>
 </property>

サービスを再起動してから、削除コマンドを再試行してください。

エラー!

失敗:LockException [エラー10280]:メタストアとの通信エラー。

メタストアに問題があります。挿入/更新/削除操作を使用するには、機能が現在開発中であるため、conf/Hive-site.xmlで次の構成を変更する必要があります。

<property>
  <name>Hive.in.test</name>
  <value>true</value>
 </property>

サービスを再起動し、コマンドを再度削除します:

Hive>delete from testTable where id = 1;

エラー!

失敗:SemanticException [エラー10297]:AcidOutputFormatを使用しないか、バケット化されていないテーブルdefault.testTableで更新または削除を試行します。

この最初のリリースでは、ORCファイル形式のみがサポートされています。この機能は、基本レコードへの更新または削除の適用方法を決定できるストレージ形式(基本的に、明示的または暗黙的な行IDを持つ)でトランザクションを使用できるように構築されていますが、これまで統合作業はORC。

これらの機能を使用するには、テーブルをバケット化する必要があります。トランザクションとACIDを使用していない同じシステム内のテーブルをバケット化する必要はありません。

ORCFileformat、バケットが有効、および( 'transactional' = 'true')で構築されたテーブルの例を参照してください。

Hive>create table testTableNew(id int ,name string ) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

挿入:

Hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');

更新:

Hive>update testTableNew set name = 'updateRow2' where id = 2;

削除:

Hive>delete from testTableNew where id = 1;

テスト:

Hive>select * from testTableNew ;
2
Devesh Sharma

Hiveの今後のバージョンでは、SETベースの更新/削除処理が可能になります。これは、一度に1行ずつ取得するのではなく、「一連の」行でCRUD操作を実行する際に最も重要です。

暫定的に、ここに記載されている動的パーティションベースのアプローチを試しました http://linkd.in/1Fq3wdb .

ニーズに合っているかどうかを確認してください。

2
Devopam Mittra

UPDATEまたはDELETEレコードはHiveでは許可されませんが、INSERT INTOは許容されます。
スニペットHadoop:The Definitive Guide(3rd edition)

更新、トランザクション、およびインデックスは、従来のデータベースの中心です。しかし、最近まで、これらの機能はHiveの機能セットの一部とは見なされていませんでした。これは、HiveがMapReduceを使用してHDFSデータ上で動作するように構築されたためです。MapReduceでは、フルテーブルスキャンが標準であり、データを新しいテーブルに変換することでテーブルが更新されます。データセットの大部分で実行されるデータウェアハウジングアプリケーションの場合、これはうまく機能します。

Hiveは更新(または削除)をサポートしていませんが、INSERT INTOをサポートしているため、既存のテーブルに新しい行を追加できます。

1
zeekvfu

最近、私は同様の問題を解決しようとしていました。ApacheHive、Hadoopは更新/削除操作をサポートしていません。そう ?したがって、次の2つの方法があります。

  1. バックアップテーブルを使用する:テーブル全体をbackup_tableに保存し、入力テーブルを切り捨てて、保持するデータのみを書き直します。
  2. 使用Uber Hudi:これはUberによって作成されたフレームワークで、削除や更新などのHDFSの制限を解決します。次のリンクをご覧ください: https://eng.uber.com/hoodie/

ポイント1の例:

Create table bck_table like input_table;
Insert overwrite table bck_table 
    select * from input_table;
Truncate table input_table;
Insert overwrite table input_table
    select * from bck_table where id <> 1;

NB:input_tableが外部テーブルの場合は、次のリンクに従う必要があります。 ハイブでパーティション化された外部テーブルを切り捨てる方法は?

0
Yardi

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

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

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

これをHive 1.2.1で試しました

0

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

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

0
Abid

良いニュース、Kuduを使用してHive/Impalaで更新と削除の挿入が可能になりました。

テーブルを維持し、レコードの挿入/更新/削除を実行するには、IMPALA/kuduを使用する必要があります。例の詳細は、ここで見つけることができます: insert-update-delete-on-hadoop

あなたが興奮している場合は、ニュースを共有してください。

-MIK

0
Mufaddal Kamdar