14

--split-by と sqoop での境界クエリの使用について誰か教えてもらえますか?

sqoop import --connect jdbc:mysql://localhost/my --username user --password 1234 --query 'select * from table where id=5 AND $CONDITIONS' --split-by table.id --target- dir /dir

4

5 に答える 5

43

--split-by :インポートの分割を生成するために使用されるテーブルの列を指定するために使用されます。これは、データをクラスターにインポートする際に分割を作成するために使用される列を指定することを意味します。より大きな並列処理を実現することにより、インポートのパフォーマンスを向上させるために使用できます。Sqoop は、インポート コマンドを介してユーザーが --split-by で指定したテーブルの特定の列の値に基づいて分割を作成します。使用できない場合は、入力テーブルの主キーを使用して分割が作成されます。

使用する理由:場合によっては、主キーの最小値と最大値の間で値が均等に分散されないことがあります ( --split-by が使用できない場合に分割を作成するために使用されます)。このような状況では、効率的なインポートのために分割を作成するために、データが適切に分散されている他の列を指定できます。

--boundary-query :デフォルトでは、sqoop は query select min(), max() fromを使用して、分割を作成するための境界を見つけます。場合によっては、このクエリが最適ではないため、 --boundary-query 引数を使用して 2 つの数値列を返す任意のクエリを指定できます。

使用する理由 : --split-by で最適なパフォーマンスが得られない場合は、これを使用してパフォーマンスをさらに向上させることができます。

于 2013-07-30T08:35:52.513 に答える
23

--split-byは、テーブルの値をマッパー全体に均一に分散するために使用されます。つまり、100 個の一意のレコード (主キー) があり、4 つのマッパーがある場合、--split-by (主キー列) は分散に役立ちます。マッパー間で均等にデータセットします。

$CONDITIONSは Sqoop プロセスによって使用され、データセットを取得するために内部で一意の条件式に置き換えられます。並列インポートを実行すると、マップ タスクは、$CONDITIONS に別の値を代入してクエリを実行します。たとえば、あるマッパーが「select bla from foo WHERE (id >=0 AND id < 10000)」を実行し、次のマッパーが「select bla from foo WHERE (id >= 10000 AND id < 20000)」を実行する可能性があります。 .

于 2013-07-30T13:31:17.037 に答える
14

Sqoop を使用すると、データを並行してインポートできます。 --split-by と --boundary-query を使用すると、より細かく制御できます。テーブルをインポートするだけの場合は PRIMARY KEY を使用しますが、より高度なクエリを実行する場合は、並列分割を行うために列を指定する必要があります。

つまり、

  sqoop import \
    --connect 'jdbc:mysql://.../...' \
    --direct \
    --username uname --password pword \
    --hive-import \
    --hive-table query_import \
    --boundary-query 'SELECT 0, MAX(id) FROM a' \
    --query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\
    --num-mappers 3
    --split-by a.id \
    --target-dir /data/import \
    --verbose

境界クエリを使用すると、最適化されたクエリを指定して最大、最小を取得できます。それ以外の場合は、 --query ステートメントで MIN(a.id), MAX(a.id) を実行しようとします。

結果は (最小 = 0、最大 = 30 の場合) は、並列で実行される 3 つのクエリになります。

SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30;
于 2013-07-29T13:43:58.853 に答える
2

また、--query値を二重引用符 (" ") で囲んで指定する場合は、前$CONDITIONSに aを付ける必要があります。slash(\)

--query "select * from table where id=5 AND \$CONDITIONS"

またはそうでなければ

--query 'select * from table where id=5 AND $CONDITIONS' 
于 2015-08-17T07:40:08.433 に答える