2017-06-28 12 views
1

大きなファイル(~~ 20 MB)を解析するためにApache Hadoopを使いたいです。これらのファイルはpostegresqlのダンプです(ほとんどがCREATE TABLEとINSERTです)。最初の場所にCREATE TABLEまたはINSERT INTO以外のものをフィルタリングするだけで済みます。Hadoop grep dump sql

grep map reduceを^(CREATE TABLE|INSERT).*;$パターン(CREATE TABLEまたはINSERTで始まり、 ";"で終わる行)で使用することにしました。 私はMapReduceのを書くことができると思います(CREATE TABLE test(\n "id"....\n..."name"...\n );のような)

私の問題は、これらのいくつかは、作成および(スキーマは私が推測本当に大きいため)複数の行を取る挿入しているので、パターンがすべてでそれらを一致させることができませんジョブを1つの行に "挿入"と "作成"をそれぞれリファクタリングすることができますが、ファイルが大きいため実際にはコストがかかるでしょう。ファイルからすべての「\ n」を削除することもできますが、1回のマップ操作で複数の作成/挿入を処理しなければならず、作業のバランスが悪くなります。私は本当に挿入または作成ごとに1つのマップ操作が欲しいです。

初期ダンプファイルのレイアウトを変更することはできないので、私はダンプファイルの作成に責任を負いません。

私は実際に何が最良の解決策であるか分からない、私はいくつかの助けを使用することができます:)。必要に応じて追加の情報を提供することができます。最初

+0

この正規表現では、有効な行https://regex101.com/r/myrLaA/1をすべて抽出するのはどうですか?注:サンプルデータがなければ、あなたに良い答えを与えるのはかなり難しいです。 –

+0

申し訳ありません本当の問題について私は本当に明確ではありませんでした。正規表現は大丈夫です、私はHadoopマップの仕組みを理解するのに苦労しました。私はHadoop(https://wiki.apache.org/hadoop/Grep)のgrep mapreduceの例を使用して作業を始めましたが、この例のマップ操作は1行の関数であるため、完全なSQL行を取得する方法はありませんでした。代わりに、標準のgrepを使うのではなく、マッパーを書いてファイル全体を扱うようにします。とにかくあなたの助けのためのThx :) –

答えて

0

まず物事:(あなたが唯一のデータの小さな量を持っていない限り)ので、可能な並列化のたくさんあるはず 20メガバイトのファイルは、Hadoopの標準に大きなファイルではありません、あなたは、おそらく多くのファイルを持っています。

このように1ファイルあたり1マッパーを持つことは非常にうまくいく可能性があります。ファイルを連結してオーバーヘッドを減らすこともできます。


言われていること:

あなたが一度にすべての行を処理すると、一度に一つの行を処理することは不十分でない場合は、唯一の簡単な解決策を扱うことであろう「数'行を一度に、たとえば2または3に変更してください。

もう1つの解決策は、ファイルを切り上げてファイルごとに1つのマップを使用することですが、エッジを処理する必要があります目的のビットの1つを削除します。

これはまだかなり概念的な答えですが、これまでのあなたの進歩に基づいて、私はこれがあなたをそこに連れて行くのに十分かもしれないと感じています。

+0

それは私が実際に探していたかなり答えです!あなたが言及したように、Hadoopでは20MBのテキストファイルはまったく巨大ではなく、必要な並列化を達成するのに十分なファイル(現在は約500ファイル、おそらく将来的には成長するでしょう)を持っています。一度マッピングするのではなく、ファイルを複数のマップ操作に分割するオーバーヘッドが増えます。あなたが言ったように、マップ操作を開始する前に各ファイルを分割するのではなく、ファイルを連結する可能性が高くなります。代替ソリューションを使用すると、問題の理解に役立ちます。答えのために多くのThx。 –