2

Q: SQOOP を使用して SQL サーバーから 5000 行をインポートしたいのですが、20000 行になります。以下のクエリを使用しています。

sudo -E -u hdfs sqoop import --connect "jdbc:sqlserver://hostname;username=*****;password=*****;database=*****" --driver com.microsoft.sqlserver.jdbc.SQLServerDriver --query "select top 5000 * from Tb_Emp  where \$CONDITIONS" --split-by EmpID -m 4 --target-dir /home/sqoop_SQLServeroutput

20000 件のレコードを取得しました

すべてのマッパーが 5000 レコードを取得しています。しかし、mysqlでこれを行うと、予想どおり5000レコードが得られます。

sudo -E -u hdfs sqoop import --connect jdbc:mysql://hostname/<database_name> --username **** --password **** --query 'select * from Tb_Emp where $CONDITIONS limit 5000' --split-by EmpID -m 4 --target-dir /home/sqoop_MySqloutput

5000 件のレコードを取得しました。

なぜそれが起こっているのですか?

4

1 に答える 1

0

「top x」または「limit x」句を使用しても、Sqoop ではあまり意味がありません。クエリの実行ごとに異なる値が返される可能性があるためです (「order by」はありません)。また、句は分割生成を混乱させる可能性が非常に高く、簡単に確定できない出力で終了します。定義済みの行数をインポートする必要がある場合に備えて、1 つのマッパー (-m 1 または --num-mappers 1) のみを使用することをお勧めします。別の解決策は、MySQL/SQL Server 側で必要なデータを含む一時テーブルを作成し、この一時テーブル全体を Sqoop でインポートすることです。

于 2013-09-03T08:47:22.437 に答える