ハイブ/インパラ一括挿入データ

問題の説明

既存のデータの何千も、対応するハイブ/インパラテーブルに挿入する必要があります。すべてのは、ゆっくりと、対応するINSERT文を処理し、各データ変換のために、しかし、それの実際の実装:彼のアプローチがある見......行うには同僚のために配置されたが、長い時間を待って、フィードバックが完了挿入されていませんデータの1秒程度かかります。MySQLのデータで一括挿入よりもはるかに遅いので、あまり簡単にインパラが文句を言います

分析

方法は、MySQLでのかどうか、または分散コンポーネントでハイブ、インパラでは、各ステートメントにデータを挿入し、確かに最も効率的にすることを第一には、それが明確でなければなりません。

このように、リソースの消費量は、SQL文を解析し、より多くの接続を過ごし、実行計画の生成は、データは実際にはオーバーヘッドが比較的少ない挿入されています。

したがって、バルクデータの挿入を改善するために、キーは、より多くのデータ挿入、極力個数によって、不必要なリソースのコストを低減しているSQL、SQLのスループットを改善することです。

ソリューション

テストデータ:

aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj

テストテーブル:

create table if not exists test.test_batch_insert(
    f1 string
) comment 'test for batch insert'
row format delimited fields terminated by '\t' lines terminated by '\n'
stored as textfile;

シナリオ1(最も遅い):INSERT INTOステートメントのデータ

STEP1:SQL文に加工

vim中:
%s/^/insert into test.test_batch_insert select '/g
%s/$/';/g
 
 
或者使用awk:
awk '{printf "insert into test.test_batch_insert select \"%s\";\n", $0}' test.txt > test.sql

生成されたSQLスクリプト:

insert into test.test_batch_insert select "aaa";
insert into test.test_batch_insert select "bbb";
insert into test.test_batch_insert select "ccc";
insert into test.test_batch_insert select "ddd";
insert into test.test_batch_insert select "eee";
insert into test.test_batch_insert select "fff";
insert into test.test_batch_insert select "ggg";
insert into test.test_batch_insert select "hhh";
insert into test.test_batch_insert select "iii";
insert into test.test_batch_insert select "jjj";

STEP2:生成されたSQLスクリプトを実行します

impala-shell -i data1 -f test.sql

もっとゆっくり実行セクション......

スキーム2(比較的速い):データの可能なSQLの複数の挿入

STEP1:SQLに変換

awk 'BEGIN{print "insert into test.test_batch_insert"; i=1; n=10} {if(i<n){ printf "select \"%s\" union\n", $0; i++} else {printf "select \"%s\";", $0}}' test.txt > test2.sql
 
 
vim %s 或者 sed也行

生成されたSQLスクリプト:

insert into test.test_batch_insert
select "aaa" union
select "bbb" union
select "ccc" union
select "ddd" union
select "eee" union
select "fff" union
select "ggg" union
select "hhh" union
select "iii" union
select "jjj";

STEP2:生成されたSQLを実行します

実行する前に、最初の空のテーブル。

impala-shell -i data1 -f test2.sql

実行後、あなたは少し速くより多くを見つけるでしょう......

しかし、このアプローチには限界がある......

SQLの長さのなので、大量のデータを制限され、ちょうどSQLを生成し、長期につながる実行することはできません。この場合、分割ファイルを考えてみます。

split -l 500 test.txt test_split_

次に、各スライスを通じてスクリプトファイルを作成し、あなたは上記の操作を繰り返すことができます。

シナリオ3(最速、あなたがよりよいいないのであれば)

STEP1:table文の建設test.test_batch_insertの下で最初のチェック:

impala-shell -i data1 -B -q "show create table test.test_batch_insert"

次のようにtable文の構築は以下のとおりです。

Query: show create table test.test_batch_insert
"CREATE TABLE test.test_batch_insert (
  f1 STRING
)
 COMMENT 'test for batch insert'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
WITH SERDEPROPERTIES ('field.delim'='\t', 'line.delim'='\n', 'serialization.format'='\t')
STORED AS TEXTFILE
LOCATION 'hdfs://xxxxxx:8020/user/hive/warehouse/test.db/test_batch_insert'
"

HDFS上のルックLOCATIONプロパティは、このパスを表示します。

hdfs dfs -ls /user/hive/warehouse/test.db/test_batch_insert

次に、ファイルの中身を見てみましょう。

hdfs dfs -cat /user/hive/warehouse/test.db/test_batch_insert/*data.0.

読みやすい、プレーンテキストファイルで、各行がデータであり、それを発見しました。それはレコードセパレータとしてN \によって指定されるテーブルの上記構成からです。

賢明なあなたは、私が次に何か知っている必要があり、ここを参照してください......

STEP2:データファイルをアップロード

まず第一に、再びtest.test_batch_insertを空にする。

次に、ファイルをアップロードします。

hdfs dfs -put test.txt /user/hive/warehouse/test.db/test_batch_insert

この場合、ハイブ表は、あなたが直接データを照会することができるはずです、インパラは、以下の表を更新する必要があります。

impala-shell命令行窗口中执行:
refresh test.test_batch_insert;

次に、取得し......

実際には、ハイブ/ impla MySQLのように、対応するLOAD DATA文は......ここだけで、実際にビットを表示することをやってLOAD DATA文にあります......

おすすめ

転載: www.cnblogs.com/dqrcsc/p/12154718.html