私はハイブが初めてで、SQL のようにデータをハイブ テーブルに挿入する方法があるかどうかを知りたいです。データをハイブのように挿入したい
INSERT INTO tablename VALUES (value1,value2..)
ファイルからハイブテーブルにデータをロードしたり、あるテーブルからハイブテーブルにデータをインポートしたりできると読みましたが、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);
テーブル生成関数stack
を使用して、リテラル値をテーブルに挿入できます。
最初に、1 行だけを含むダミー テーブルが必要です。limit を使用して生成できます。
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;
既存のテーブルを使用してハックする必要はありません。
以下のアプローチを使用できます。これにより、さらに選択してロードするために一時テーブルまたは 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 ハイブ ステートメントが必要です。下記参照。
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 レベルでの追加ではありません)。ただ、既存の Hive テーブルに対してOVERWRITE
句なしで 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
はい、挿入できますが、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 テーブルの新しいパーティションに挿入します。ここでの制約は、メイン テーブルを事前にパーティション分割する必要があることです。パーティションを使用しない場合、テーブル全体がこれらの新しいレコードに置き換えられます。
このようなシナリオでは、そのような種類の挿入を容易にする HBASE を使用する必要があると思いますが、SQL の種類のクエリ言語は提供しません。このような挿入を行うには、put メソッドのような HBASE の Java API を使用する必要があります。さらに、HBASE は列指向の非 SQL データベースです。
Hive の複合型に挿入することもできます - 動作します (id は int、同僚配列)
insert into emp (id,colleagues) select 11, array('Alex','Jian') from (select '1')