sqoop import --connect jdbc:teradata://192.168.xx.xx/DBS_PORT=1025,DATABASE=ds_tbl_db --driver com.teradata.jdbc.TeraDriver --username dbc --password dbc --query 'select * from reason where id>20' --Hive-import --Hive-table reason_Hive --target-dir <hdfs-location> -m 1
エラーが発生しました:
クエリ[select * from reason from id> 20]には、WHERE句に「$ CONDITIONS」が含まれている必要があります。
Sqoopのクエリにはwhere句が必要だと思います。
したがって、次のようなクエリの場合
select * from reason
私はそれを次のように変更します:
select * from reason WHERE $CONDITIONS
where
句を持つクエリに対して何をすべきか?
AND \$CONDITIONS
を追加する必要があります
--query "select * from reason where id>20 AND \$CONDITIONS"
Sqoopドキュメント を参照してください。
Sqoopは、列タイプ情報などのテーブルのメタデータにアクセスする必要があります。プレースホルダー$ CONDITIONSはデフォルトで '1 = 0'に設定され、sqoopが型情報のみを受信するようにします。そのため、sqoopコマンドを実行すると、最初に起動されるクエリがデフォルトの$ CONDITIONSであることがわかります。後で、マッパーの数(-m)または--split-by列または--boundary-queryに基づいて異なる範囲を定義する異なる値に置き換えられるため、データセット全体を異なるデータスライスまたはチャンクとチャンクに分割できます並行処理が可能な限り並行してインポートできます。 Sqoopは、このプレースホルダーを、個々のタスクごとに転送するデータスライスを指定する生成条件で自動的に置き換えます。
たとえば、列名、ID、および給与を含むsample_dataテーブルについて考えます。給与が1kを超えるレコードを取得します。
sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba --password cloudera \
--query 'select * from sample_data where $CONDITIONS AND salary > 1000' \
--split-by salary \
--target-dir hdfs://quickstart.cloudera/user/cloudera/sqoop_new
以下は、空のセットを返す最初のクエリです。
SqlManager: Executing SQL statement: select * from sample_data where (1 = 0) AND salary > 1000
次に、範囲の最小値と最大値を取得します。
INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(salary), MAX(salary) FROM (select * from sample_data where (1 = 1) AND salary > 1000) AS t1;
Where句を使用できます
--where "order_status = 'CLOSED'"
私はcloudera
でテーブルのリストをクエリするMysql
で作業しています。
以下のクエリで結果が得られました。
sqoop import --connect jdbc:mysql://127.0.0.1/Mydatabase
--username root --password cloudera
--query 'select * from employee where $CONDITIONS AND Sal<250000'
--split-by Sal --target-dir=user/cloudera/myfirstdata2 -m 1