web-dev-qa-db-ja.com

SQLのようなHive挿入クエリ

私はHiveが初めてであり、SQLで行うようにHiveテーブルにデータを挿入する方法があるかどうかを知りたいです。私のようなデータをHiveに挿入したい

INSERT INTO tablename VALUES (value1,value2..)

ファイルからHiveテーブルにデータをロードできる、または1つのテーブルからHiveテーブルにデータをインポートできるが、SQLのようにデータを追加する方法はありますか?

53
Y0gesh Gupta

ここでの回答の一部は、Hive 0.14の時点で古くなっています

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

次のような構文を使用して挿入できるようになりました。

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2));

INSERT INTO TABLE students
  VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
98
mattinbits

テーブル生成関数スタックを使用して、リテラル値をテーブルに挿入できます。

最初に、1行のみを含むダミーテーブルが必要です。あなたは制限の助けを借りてそれを生成することができます。

CREATE TABLE one AS
SELECT 1 AS one
FROM any_table_in_your_database
LIMIT 1;

これで、次のようなリテラル値を持つ新しいテーブルを作成できます。

CREATE TABLE my_table AS
SELECT stack(3
  , "row1", 1
  , "row2", 2
  , "row3", 3
) AS (column1, column2)
FROM one
;

Stackの最初の引数は、生成する行の数です。

既存のテーブルに値を追加することもできます。

INSERT INTO TABLE my_table
SELECT stack(2
  , "row4", 1
  , "row5", 2
) AS (column1, column2)
FROM one
;
18
unique2

Unique2提案のわずかに優れたバージョンを以下に示します。

insert overwrite table target_table
select * from 
(
select stack(
    3,                 # generating new table with 3 records
    'John', 80,        # record_1
    'Bill', 61         # record_2
    'Martha', 101      # record_3
    ) 
) s;

既に終了しているテーブルを使用してハックする必要はありません。

16
Habdank

以下のアプローチを使用できます。これにより、それぞれさらに選択およびロードするために一時テーブルOR txt/csvファイルを作成する必要はありません。

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1.

tempTable_with_atleast_one_recordsは、少なくとも1つのレコードを持つテーブルです。

しかし、このアプローチの問題は、次のような複数の行を挿入するINSERTステートメントがある場合です。

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ;

次に、各行に個別のINSERT Hiveステートメントが必要です。下記参照。

INSERT INTO TABLE yourTable SELECT 1 , 'value1' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 2 , 'value2' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 3 , 'value3' FROM tempTable_with_atleast_one_records LIMIT 1;
7
Sanjiv

既存のテーブルに間違いなくデータを追加できます。 (ただし、実際にはHDFSレベルでの追加ではありません)。 OVERWRITE句を使用せずに既存のHiveテーブルでLOADまたはINSERT操作を実行すると、古いデータを置き換えずに新しいデータが配置されるだけです。そのテーブルに対応するディレクトリ内に、この新しく挿入されたデータ用の新しいファイルが作成されます。例えば ​​:

私は2行のdemo.txtという名前のファイルを持っています:

ABC
XYZ

テーブルを作成し、このファイルをロードします

Hive> create table demo(foo string);
Hive> load data inpath '/demo.txt' into table demo;

このテーブルでSELECTを実行すると、次のようになります。

Hive> select * from demo;                        
OK    
ABC    
XYZ

次のようなdemo2.txtというファイルがもう1つあるとします。

PQR

そして、上書きを使用せずにこのテーブルで再度LOADを実行します。

Hive> load data inpath '/demo2.txt' into table demo;

さて、今SELECTを行うと、それが得られます。

Hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH

6
Tariq

いいえ。現在、このINSERT INTO tablename VALUES (x,y,z)構文はHiveではサポートされていません。

4
Lukas Vermeer

table2のデータ全体をtable1に挿入します。以下はクエリです。

INSERT INTO TABLE table1 SELECT * FROM table2; 
3
Ramesh babu M

次のコマンドを入力して、何らかの条件でテストログテーブルにデータを挿入します。

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;
2
Don

はい、挿入できますが、SQLと同様ではありません。

SQLでは行レベルのデータを挿入できますが、ここではフィールド(列)ごとに挿入できます。

この間、ターゲットテーブルとクエリのデータ型と列数が同じであることを確認する必要があります。

例えば:

CREATE TABLE test(stu_name STRING,stu_id INT,stu_marks INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

INSERT OVERWRITE TABLE test SELECT lang_name, lang_id, lang_legacy_id FROM export_table;
2
user3279425

単一レコードを挿入するために挿入することはできません。 Hiveではサポートされていません。ファイルに挿入する新しいレコードをすべて配置し、そのファイルをHiveの一時テーブルに読み込むことができます。次に、insert overwrite..selectコマンドを使用して、これらの行をメインのHiveテーブルの新しいパーティションに挿入します。ここでの制約は、メインテーブルを事前にパーティション分割する必要があることです。パーティションを使用しない場合、テーブル全体がこれらの新しいレコードに置き換えられます。

1
Arijit Banerjee

Hiveの複合型に挿入できます-動作します(idはint、同僚の配列)

empに挿入(id、colleagues)select 11、array( 'Alex'、 'Jian')from(select '1')

0
Hemant

このようなシナリオでは、このような種類の挿入を容易にするHBASEを使用する必要がありますが、SQL種類のクエリ言語は提供しないと思います。このような挿入を行うには、putメソッドのようなHBASEのJava AP​​Iを使用する必要があります。さらに、HBASEは列指向の非SQLデータベースです。

0
Binary01

Hiveテーブルにデータを挿入する方法:デモ用に、テーブル名をtable1およびtable2として使用しています

1)create table table2 as select * from table1 where 1=1;またはcreate table table2 as select * from table1;

2)insert overwrite table table2 select * from table1;-あるデータを別のデータに挿入します。注:ターゲットを更新します。

3)insert into table table2 select * from table1;-あるデータを別のデータに挿入します。注:ターゲットに追加されます。

4)load data local inpath 'local_path' overwrite into table table1;-ローカルからターゲットテーブルにデータをロードし、ターゲットテーブルも更新します。

5)load data inpath 'hdfs_path' overwrite into table table1;-hdfsロケーションiからデータをロードし、ターゲットテーブルも更新します。または

create table table2(
    col1 string,
    col2 string,
    col3 string)
    row format delimited fields terminated by ','
    location 'hdfs_location'; 

6)load data local inpath 'local_path' into table table1;-ローカルからデータをロードし、ターゲットテーブルに追加します。

7)load data inpath 'hdfs_path' into table table1;-hdfsの場所からデータをロードし、ターゲットテーブルに追加します。

8)insert into table2 values('aa','bb','cc'); --table2には3列しかないとします。

9)Hiveテーブルへの複数挿入

0
Brijesh Mishra

はい、Hiveでクエリの挿入を使用できます。

Hive> create table test(id int、name string);

INSERT:INSERT ... VALUESは、バージョン:Hive 0.14以降で使用可能です。

Hive>テーブルにテスト値を挿入(1、 'mytest');

これは挿入に対して機能します。 valuesキーワードを使用する必要があります。

注:ユーザーは、** INSERT INTO ... VALUES句を使用して、複雑なデータ型の列(配列、マップ、構造体、ユニオン)にデータを挿入できません。

0
Viraj.Hadoop