1、背景

使用sqoop import命令导出mysql中的数据至hive中,出现了Can not issue empty query.错误
image.png

2、问题追踪

使用的命令

  1. sqoop import \
  2. --connect jdbc:mysql://192.168.159.xxx:3306/hive \
  3. --username root \
  4. --password 123456 \
  5. --query 'select c.NAME,c.DB_LOCATION_URI,a.TBL_NAME,a.OWNER,a.TBL_TYPE,b.LOCATION from TBLS a,SDS b,DBS c where a.SD_ID=b.SD_ID and a.DB_ID=c.DB_ID and $CONDITIONS' \
  6. --fields-terminated-by ',' \
  7. --delete-target-dir \
  8. --hive-database default \
  9. --create-hive-table \
  10. --target-dir /tmp/targs_hive_tb \
  11. --hive-import \
  12. --hs2-url "jdbc:hive2://cdh01.tianbo.com:10000/;principal=hive/cdh01.tianbo.com@FAYSON.COM" \
  13. --hs2-user test_1111@FAYSON.COM \
  14. --hs2-keytab "/root/image/test_1111.keytab" \
  15. --hive-overwrite \
  16. --hive-table targs_hive_tb \
  17. --m 0

由于出现了Can not issue empty query.的错误,查询文档,发现是mysql本身报出的错误。
是由于sql没有传进去。最后看到$CONDITIONS参数,官网给的解释是
image.png
如果你想通过并行的方式导入结果,每个map task需要执行sql查询语句的副本,结果会根据sqoop推测的边界条件分区。query必须包含$CONDITIONS。这样每个scoop程序都会被替换为一个独立的条件。同时你必须指定--split-by.分区
然后就看到-m的值我设置为0。后面我将-m值该为1,然后就成功了

3、解决方案

sqoop import \
--connect jdbc:mysql://192.168.159.xxx:3306/hive \  
--username root \
--password 123456 \
--query 'select c.NAME,c.DB_LOCATION_URI,a.TBL_NAME,a.OWNER,a.TBL_TYPE,b.LOCATION from TBLS a,SDS b,DBS c where a.SD_ID=b.SD_ID and a.DB_ID=c.DB_ID and $CONDITIONS' \
--fields-terminated-by ',' \
--delete-target-dir \
--hive-database default \
--create-hive-table \
--target-dir /tmp/targs_hive_tb \
--hive-import \
##使用hiveserver2导入数据
--hs2-url "jdbc:hive2://cdh01.tianbo.com:10000/;principal=hive/cdh01.tianbo.com@FAYSON.COM" \ 
--hs2-user test_1111@FAYSON.COM \
##使用keytab进行认证
--hs2-keytab  "/root/image/test_1111.keytab" \
--hive-overwrite \
--hive-table targs_hive_tb \
--m 1