値が均等に分散される列がないと仮定して、次のようなコマンドがあるとします。
sqoop import \
...
--boundary-query "SELECT min(id), max(id) from some_table"
--split-by id
...
--split-byが同じことをしているのに、ここで--boundary-queryを使用する意味は何ですか? --boundary-queryを使用する他の方法はありますか?または、キー(一意の)列がない場合にデータをより効率的に分割する他の方法はありますか?
_--split-by id
_は、マッパーの数に基づいてデータを分割します均一に(デフォルトは4)。
これで、デフォルトの境界クエリは次のようになります。
_--boundary-query "SELECT min(id), max(id) from some_table"
_
しかし、id
開始 _val1
_および終了 _val2
_を知っている場合。その場合、min()
およびmax()
操作を計算する意味はありません。これにより、sqoopコマンドの実行が高速になります。
_val1
_および_val2
_を返す任意のクエリを指定できます。
編集:
現在(1.4.7)sqoopには、分割するための不均一なパーティションを指定する方法はありません。
たとえば、次のようなデータがあります。
_1,2,3,51,52,191,192,193,194,195,196,197,198,199,200
_
コマンドで4つのマッパーを定義した場合。最小値と最大値(この場合は1と200)をチェックします。
次に、それを4つの部分に分割します。
_1-50
51-100
101-150
151-200
_
はい、この3番目のマッパー(101-150)では、RDBMSテーブルからnothingを取得します。
しかし、次のようなカスタムパーティションを定義する方法はありません。
_1-10
51-60
190-200
_
大きなデータ(数十億行)の場合、このような正確な値を検索したり、別のツールを使用して最初にデータパターンを検索してから、カスタムパーティションを準備したりすることは実際には適切ではありません。
-split-by自由形式のクエリインポートの場合、「split-by」を指定する必要があります。特定のクエリの結果をインポートする場合、sqoopは分割を作成するために使用する列名を知っている必要があります。一方、テーブルのインポート中に、指定されていない場合は、インポートされるテーブルの主キーを使用して分割を作成します。主キーが不均一で一貫性がない場合は、split-byを使用して他の列を指定することもできます。
-boundary-query sqoopインポートプロセス中に、このクエリを使用して分割を作成するための境界を計算します。table_nameからmin()、max()を選択します。
場合によっては、このクエリが最適ではないため、-boundary-query引数を使用して2つの数値列を返す任意のクエリを指定できます。これにより、min(split-by)およびmax(split-by)操作が節約され、より効率的になります。
私は自分が期待していたことを答えから読みませんでした。
-split-by:
--split-byは主に、主キーを持たないテーブルがある場合に使用されます。テーブルに主キーがない場合、sqoopは通常エラーメッセージを出力します。 --split-byは、pkがない場合にmin()とmaxを計算するために使用される別の列を決定するために使用されています。いくつかの要件は次のとおりです。
パフォーマンス上の理由から、インデックス付きの列でのみ--split-byを使用してください。複数のテーブルからデータをインポートする必要がある場合、それらすべてのテーブルを調べて、主キーがあるテーブルと主キーがないテーブルを確認するのは当然困難です。ここでは、-autoreset-to-one-mapperを使用します。 -m#of_mappersとともに使用されるマッパー。したがって、コマンドは次のようになります。
sqoop-import --connect jdbc:mysql://localhost/dbName --table sometable --username uname --warehouse-dir whdir --autoreset-to-one-mapper -m 5
主キーを含まないテーブルは1つのスレッドを(順番に)使用し、主キーを含むテーブルは指定された5つのスレッドまたはマッパーを使用します。 1つのコマンドで--autoreset-to-one-mapperと-split-byの両方を使用することはできません。
-boundary-queries:
テーブルの最小値と値がわかっている場合は、複雑なデフォルトの計算を放棄してそれらを取得でき、境界クエリの引数として単純にハードコーディングできます。 @burakongunはこれをよく説明しました。