私はHiveが初めてであり、SQLで行うようにHiveテーブルにデータを挿入する方法があるかどうかを知りたいです。私のようなデータをHiveに挿入したい
INSERT INTO tablename VALUES (value1,value2..)
ファイルからHiveテーブルにデータをロードできる、または1つのテーブルからHiveテーブルにデータをインポートできるが、SQLのようにデータを追加する方法はありますか?
ここでの回答の一部は、Hive 0.14の時点で古くなっています
次のような構文を使用して挿入できるようになりました。
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);
テーブル生成関数スタックを使用して、リテラル値をテーブルに挿入できます。
最初に、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
;
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;
既に終了しているテーブルを使用してハックする必要はありません。
以下のアプローチを使用できます。これにより、それぞれさらに選択およびロードするために一時テーブル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;
既存のテーブルに間違いなくデータを追加できます。 (ただし、実際には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
いいえ。現在、このINSERT INTO tablename VALUES (x,y,z)
構文はHiveではサポートされていません。
table2
のデータ全体をtable1
に挿入します。以下はクエリです。
INSERT INTO TABLE table1 SELECT * FROM table2;
次のコマンドを入力して、何らかの条件でテストログテーブルにデータを挿入します。
INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;
はい、挿入できますが、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;
単一レコードを挿入するために挿入することはできません。 Hiveではサポートされていません。ファイルに挿入する新しいレコードをすべて配置し、そのファイルをHiveの一時テーブルに読み込むことができます。次に、insert overwrite..selectコマンドを使用して、これらの行をメインのHiveテーブルの新しいパーティションに挿入します。ここでの制約は、メインテーブルを事前にパーティション分割する必要があることです。パーティションを使用しない場合、テーブル全体がこれらの新しいレコードに置き換えられます。
Hiveの複合型に挿入できます-動作します(idはint、同僚の配列)
empに挿入(id、colleagues)select 11、array( 'Alex'、 'Jian')from(select '1')
このようなシナリオでは、このような種類の挿入を容易にするHBASEを使用する必要がありますが、SQL種類のクエリ言語は提供しないと思います。このような挿入を行うには、putメソッドのようなHBASEのJava APIを使用する必要があります。さらに、HBASEは列指向の非SQLデータベースです。
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テーブルへの複数挿入
はい、Hiveでクエリの挿入を使用できます。
Hive> create table test(id int、name string);
INSERT:INSERT ... VALUESは、バージョン:Hive 0.14以降で使用可能です。
Hive>テーブルにテスト値を挿入(1、 'mytest');
これは挿入に対して機能します。 valuesキーワードを使用する必要があります。
注:ユーザーは、** INSERT INTO ... VALUES句を使用して、複雑なデータ型の列(配列、マップ、構造体、ユニオン)にデータを挿入できません。