Sqoop - 如何使用伪列进行拆分

时间:2016-01-30 02:53:56

标签: hadoop db2 sqoop

我正在使用Sqoop从DB2中提取数据。 有没有办法在Sqoop命令中使用动态计算的列作为Split By?例如:如果我将row_number()计算为我的Sqoop查询的一部分,并且我想将其用作Split By:

sqoop import -m 40 --boundary-query "select 1, count(*) from tablename" --query "select t.*, row_number() over(ORDER BY columnname) had_key from tablename  t WHERE \$CONDITIONS" --split-by had_key

我收到以下错误:

Error: java.io.IOException: SQLException in nextKeyValue
Caused by: com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-968, SQLSTATE=57011, SQLERRMC=null, DRIVER=4.14.88

2 个答案:

答案 0 :(得分:0)

我不认为,sqoop使用计算列来对源表进行分区。它必须是一个物理专栏。

答案 1 :(得分:0)

我正在尝试不同的事情,所以我原来的问题中的错误是针对另一种情况。 当我将查询作为

--boundary-query "select 1, count(*) from tablename" --query "select t.*, row_number() over(ORDER BY columnname) had_key from tablename t WHERE \$CONDITIONS" --split-by had_key

错误是

Error: java.io.IOException: SQLException in nextKeyValue
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=HAD_KEY, DRIVER=4.14.88

此错误的原因是无法找到HAD_KEY列。 当我更改下面的查询并将默认映射器保留为4

"select * from (select t.*, row_number() over(ORDER BY columnname) had_key from tablename t) WHERE \$CONDITIONS"

问题已解决,我能够成功使用计算列HAD_KEY进行拆分。如果我使用上面的查询使用40个映射器,则抛出表空间错误

Error: java.io.IOException: SQLException in nextKeyValue
Caused by: com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-968, SQLSTATE=57011, SQLERRMC=null, DRIVER=4.14.88

所以我只需要根据源DB上可用的资源确定正确的映射器数量