我正在使用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
答案 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上可用的资源确定正确的映射器数量