1

以 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需要什么?

指导我一样。
谢谢。

4

3 回答 3

2

之所以 Sqoop 导入在使用 --query 时需要 --split-by 是因为在“查询”中指定数据的源位置时,无法知道/猜测 Sqoop 的主键。因为,在查询中,您可以连接两个或多个具有多个键和字段的表。因此,Sqoop 无法知道/猜测它可以拆分哪些键。

于 2016-11-25T12:17:45.200 回答
1

它不是--split-by使用的主键。由于使用--query选项,您会看到错误。此选项必须--split-by,--target-dir$CONDITIONS在查询中使用。

free_form_query_imports 文档

导入自由格式查询时,您必须使用 --target-dir 指定目标目录。

如果要并行导入查询的结果,则每个映射任务都需要执行查询的副本,结果由 Sqoop 推断的边界条件进行分区。您的查询必须包含标记 $CONDITIONS,每个 Sqoop 进程将用唯一的条件表达式替换该标记。您还必须使用 --split-by 选择拆分列。

--where如果您不想使用--split-byand ,可以使用option --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" 

选择_the_data_to_import

默认情况下,sqoop 将使用查询select min(<split-by>), max(<split-by>) from <table name>来找出创建拆分的边界。在某些情况下,此查询不是最佳查询,因此您可以使用 --boundary-query 参数指定返回两个数字列的任意查询。

于 2016-08-12T00:44:04.563 回答
0

根据 sqoop文档

如果要并行导入查询的结果,则每个映射任务都需要执行查询的副本,结果由 Sqoop 推断的边界条件进行分区。您的查询必须包含标记 $CONDITIONS,每个 Sqoop 进程将用唯一的条件表达式替换该标记。您还必须使用 --split-by 选择拆分列。

所以你必须在标签中指定你的主键。--split-by

如果选择 1 个 mapper,Sqoop 将不会并行拆分任务并在 1 个 mapper 中执行完全导入。

检查我的另一个答案如果需要)以了解$CONDITIONS映射器的需求和数量。

于 2016-08-11T18:30:03.887 回答