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

lnxxn5zx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(387)

我使用sqoop从db2中提取数据。有没有一种方法可以在sqoop命令中使用动态计算为split by的列?例如:如果我在sqoop查询中计算行\u number(),并将其用作拆分依据:

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
js81xvg6

js81xvg61#

我在尝试不同的事情,所以我原来问题中的错误是另一种情况。当我把这个问题作为

--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\ U key列。当我将查询更改为如下,并将默认Map器保留为4时

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

该问题已解决,我能够成功地使用计算列had\ U键进行拆分。如果我在上面的查询中使用40个Map器,它会抛出表空间错误

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

因此,我只需要根据源数据库上可用的资源来确定Map器的正确数量

fivyi3re

fivyi3re2#

我不认为,sqoop使用计算列来划分源表。它必须是一个物理柱。

相关问题