以dept_id为主键的MySQL表
|dept_id | dept_name |
| 2 | Fitness
| 3 | Footwear
| 4 | Apparel
| 5 | Golf
| 6 | Outdoors
| 7 | Fan Shop
Sqoop查询
sqoop import \
-m 2 \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba \
-P \
--query 'select * from departments where dept_id < 6 AND $CONDITIONS' \
--target-dir /user/cloudera/sqoop_import/departments;
在控制台上出现错误的结果:
并行导入查询结果时,必须指定
--split-by
---问题点!---
即使桌子有主键和分裂可以在2个映射器之间平均分配,然后需要 - spit-by 或 -m 1 ?
指导我 感谢。
答案 0 :(得分:2)
当您使用--query时,Sqoop导入需要--split-by的原因是因为当您在“query”中指定数据的源位置时,无法知道/猜测Sqoop的主键。因为,在查询中,您可以连接两个或多个具有多个键和字段的表。因此,Sqoop无法知道/猜测它可以分割出哪些键。
答案 1 :(得分:1)
使用--split-by
时,它不是主键。您因使用--query
选项而看到错误。此选项 必须 与查询中的--split-by
,--target-dir
和$CONDITIONS
一起使用。
free_form_query_imports documentations
导入自由格式查询时,必须指定目标 目录与--target-dir。
如果要并行导入查询结果,则每个 map任务需要执行查询的副本,并带有结果 由Sqoop推断的边界条件划分。您的查询必须 包括每个Sqoop进程将替换的令牌$ CONDITIONS 具有独特的条件表达。您还必须选择拆分 列--split-by。
如果您不想使用--where
和--split-by
,则可以使用--query
选项:
sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username=retail_dba \
-P \
--table departments \
--target-dir /user/cloudera/departments \
-m 2 \
--where "department_id < 6"
如果您使用--boundary-query
选项,则不需要--split-by
,--query
选项:
sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username=retail_dba \
-P \
--table departments \
--target-dir /user/cloudera/departments \
-m 2 \
--boundary-query "select 2, 6 from departments limit 1"
默认情况下,sqoop将使用查询
select min(<split-by>), max(<split-by>) from <table name>
来查找创建边界 分裂。在某些情况下,此查询不是最佳的,因此您可以 指定任意返回两个数字列的任意查询 --boundary-query argument。
答案 2 :(得分:0)