Sqoopを使用してRDBMSテーブルデータ(テーブルには主キーがありません)をHiveにインポートできますか?はいの場合、sqoopimportコマンドを実行してください。
Sqoop import generalコマンドで試しましたが、失敗しました。
テーブルに主キーが定義されていない場合は、データをインポートするための-m 1
オプションを指定するか、--split-by
引数に列名を指定する必要があります。指定しないと、エラーが発生します。
ERROR tool.ImportTool: Error during import: No primary key could be found for table <table_name>. Please specify one with --split-by or perform a sequential import with '-m 1'
すると、sqoopコマンドは次のようになります
sqoop import \
--connect jdbc:mysql://localhost/test_db \
--username root \
--password **** \
--table user \
--target-dir /user/root/user_data \
--columns "first_name, last_name, created_date"
-m 1
または
sqoop import \
--connect jdbc:mysql://localhost/test_db \
--username root \
--password **** \
--table user \
--target-dir /user/root/user_data \
--columns "first_name, last_name, created_date"
--split-by created_date
PrimarykeyなしでRDBMSからHiveにデータをインポートできます。
まず、Hiveでテーブルを作成する必要があります。その後、次のコードを記述する必要があります。
sqoop import \
--connect jdbc:mysql://localhost/test_db \
--username root \
--password **** \
--table <RDBMS-Table-name> \
--target-dir /user/root/user_data \
--Hive-import \
--Hive-table <Hive-table-name> \
--create-Hive-table \
-m 1 (or) --split-by <RDBMS-Column>
1つのマッパーを使用する最初のシナリオでは...ファイルのサイズが非常に大きい場合、このプロセスは応答に時間がかかるか、失敗する可能性があります。 mapper = 1を使用する前に、データのサイズを確認してください。
クイックビュー:
説明:通常、Sqoopジョブを内部で実行すると、テーブル内の主キーが検索されます。主キーがない場合、Sqoopジョブは失敗し、エラーは次のようになります。 "インポート中のエラー:テーブルの主キーが見つかりませんでした。-split-byで指定するか、 '-m1で順次インポートを実行してください。 '"。この提案では、このシナリオには2つの代替アプローチがあると説明されています。
最善の方法はオプション2です
マッパーの数を1として指定するには(デフォルトでは4)。したがって、マッパーの数を1に指定すると、タスクはシーケンシャルになり、シングルスレッドタスクと同じになります。これは、小さなテーブルをターゲットにしている場合にのみ成功します。大きなインポートを探している場合、タスクが永久に実行される傾向があるため、これは失敗します。
最良のアプローチは、インデックス付き列に基づいてマッパーの数を指定するか、手動で(クエリを使用して)列を分割できるsplit-byを使用することです。
コマンドで以下を使用します。
--autoreset-to-one-mapper
Import
は、テーブルに主キーがなく、分割列が指定されていない場合、1つのマッパーを使用する必要があります。 --split-by <col>
オプションと一緒に使用することはできません。