需要将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'