問題の説明
既存のデータの何千も、対応するハイブ/インパラテーブルに挿入する必要があります。すべてのは、ゆっくりと、対応する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文にあります......