69

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

INSERT INTO tablename VALUES (value1,value2..)

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

4

16 に答える 16

123

ここでの回答の一部は、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);
于 2015-07-27T14:55:27.840 に答える
21

テーブル生成関数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
;
于 2013-09-20T08:55:44.610 に答える
16

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;

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

于 2015-03-04T15:34:04.133 に答える
8

以下のアプローチを使用できます。これにより、さらに選択してロードするために一時テーブルまたは 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;
于 2014-11-11T07:09:23.450 に答える
6

確かに、既存のテーブルにデータを追加できます。(ただし、実際には 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

于 2013-07-03T14:52:52.147 に答える
3

はい、挿入できますが、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;
于 2014-03-04T11:07:35.993 に答える
2

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

于 2013-07-03T06:11:48.597 に答える
0

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

于 2013-07-03T12:50:26.937 に答える
0

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

insert into emp (id,colleagues) select 11, array('Alex','Jian') from (select '1')

于 2019-07-27T08:15:51.087 に答える