SQOOP从mysql导入数据到hive问题

需要将mysql一张表的数据导入到hive表当中
初始的执行命令如下:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8
--username root 
--password 123456 
--table test
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

执行没有问题,将表中的所有数据导入到了hive。注意**- -delete-target-dir参数,如果这个目录是已经存在而没有配置这个delete参数,会包路径已存在的错误。现在以- -query**参数执行sql筛选数据:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query 'select * from test where Id='86461a32-37bf-42b9' ' 
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

执行出现问题,提示:

When importing query results in parallel, you must specify --split-by.

分析上面的命令,需要参数**- -split-by**,这个参数的意思是,指定一个字段作为分区字段,比如 id 字段,数字是0到1000,可能会指定0-100为一个分区,启动一个mapTask进行处理,每100分别启动一个maptask。可以看出,如果指定的字段为字符串类型,会显得非常不友好。 但是有另外一个参数可以解决**- -num-mappers 1** ,直接指定maptask数量。
修改命令如下:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query 'select * from test where Id='86461a32-37bf-42b9' ' 
--num-mappers 1
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

接着报错:

 ERROR tool.ImportTool: Import failed: java.io.IOException: Query
  [select * from dict_item where dictTypeId=86461a32-37bf-42b9-a3e0-c85b676b2718 ] 
 must contain '$CONDITIONS' in WHERE clause.

可以看到两个错误,一个sql语句中where条件后面的字符串没有单引号,第二个就是query参数必须要的一个参数**$CONDITIONS**,所以,一方面将sql语句的单引号改为双引号,一方面增加$CONDITIONS参数
修改为:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query "select * from test where Id='86461a32-37bf-42b9' and  $CONDITIONS "
--num-mappers 1
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

此时还有一个问题

ERROR tool.ImportTool: Import failed: java.io.IOException: Query 
[select * from dict_item where dictTypeId='86461a32-37bf-42b9-a3e0-c85b676b2718' and   ] 
must contain '$CONDITIONS' in WHERE clause.

可以看到错误信息中sql语句where后面的conditions变量不见了,说明双引号中需要转义,加一个反斜杠
一般来说是不用加的,加了反斜杠反而会报错,但是需要根据解析出来的sql进行决策,最开始尝试建议不加

sqoop import --connect jdbc:mysql://10.x.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query "select * from test where Id='86461a32-37bf-42b9' and  \$CONDITIONS "  
--num-mappers 1 
--target-dir /home/hdfs/data/dict_item/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

综上记录使用sqoop import过程中相关的问题。import命令参数举例如下:

bin/sqoop import \
--connect jdbc:mysql://172.16.71.27:3306/babasport \
--username root \
--password root \
--query 'select id, brand_id,name from bbs_product  where $CONDITIONS LIMIT 100' \
--target-dir /user/xuyou/sqoop/imp_bbs_product_sannpy_ \
--delete-target-dir \
--num-mappers 1 \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--direct \
--fields-terminated-by '\t'

你可能感兴趣的:(分布式)