1、背景
使用sqoop import命令导出mysql中的数据至hive中,出现了Can not issue empty query.错误
2、问题追踪
使用的命令
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 \
--hs2-url "jdbc:hive2://cdh01.tianbo.com:10000/;principal=hive/cdh01.tianbo.com@FAYSON.COM" \
--hs2-user test_1111@FAYSON.COM \
--hs2-keytab "/root/image/test_1111.keytab" \
--hive-overwrite \
--hive-table targs_hive_tb \
--m 0
由于出现了Can not issue empty query.的错误,查询文档,发现是mysql本身报出的错误。
是由于sql没有传进去。最后看到$CONDITIONS参数,官网给的解释是
如果你想通过并行的方式导入结果,每个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