7.2.3 利用Query进行自定义Imports
Sqoop也可以导入任意一个SQL查询结果。你可以通过--query参数指定一个SQL语句,代替使用--table,--columns和--where参数。
当导入一个任意的查询,你必须指定目标目录(使用--target-dir)。
如果你想并行导入一个查询结果,每个map任务需要执行由Sqoop基于约束条件来划分的查询结果的拷贝。你的查询必须包含$CONDITIONS标记,每个Sqoop进程会用唯一的条件表达式代替它。你还必须选择一个用于分割的列(用--split-by)。
举例
$ sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id --target-dir /user/foo/joinresults
可替代地,查询可以执行一次,且顺序导入(通过使用-m 1来指定单独的map任务)。
$ sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
-m 1 --target-dir /user/foo/joinresults
注意
如果你的查询语句用双引号包含,你需要使用\$CONDITIONS而非$CONDITIONS来禁止shell将其作为shell的变量。比如,一个带双引号的请求应该是这样: "SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"
注意
当前版本的Sqoop的自定义请求功能限定在简单的查询,查询不能包含模糊的投影,也不能在WHERE语法里有OR条件。使用带有子查询或join操作的复杂查询会导致模糊投影并得到不能预知的结果。