Sqoop - 虽然在表中有主键但导入时出现错误

时间:2016-08-11 17:21:35

标签: hadoop hdfs sqoop hadoop2 cloudera-quickstart-vm

以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

指导我 感谢。

3 个答案:

答案 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" 

selecting_the_data_to_import

  

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

答案 2 :(得分:0)

根据sqoop docs

  

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

因此,您必须在--split-by代码中指定主键

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

检查我的另一个answer,如果你想),了解$CONDITIONS的需要和地图制作者的数量。