Sqoop尝试-按行分隔(Oracle)失败

时间:2019-03-01 10:19:45

标签: oracle11g sqoop

(请回答,这是我的第一个问题,我事先在这里和网上进行了广泛的研究。问题Oracle ROWID for Sqoop Split-By Column并没有真正解决这个问题,因为最初的Person要求使用另一栏)。 >

我正在使用sqoop从Oracle 11 DB复制数据。 不幸的是,有些表没有索引,没有主键,只有分区(日期)。这些表非常大,有数亿(如果不是数十亿)行。 到目前为止,我已经决定通过显式地处理分区来访问源中的数据。这样效果很好,并且可以很好地加快过程。

我需要按每个表中的数据进行拆分,以避免在我的bash脚本中出现过多的if-分支。 (我们在这里谈论200多个桌子)

我注意到,将8个任务拆分会导致任务之间的工作负载分配非常不均匀。我考虑过使用Oracle ROWID定义拆分。

为此,我必须定义一个边界查询。在标准查询panic中,行ID不属于结果集。因此,不允许Sqoop从--query定义边界查询。

现在,当我运行此命令时,出现错误

'select * from xyz'

ROWID的样本:

AAJXFWAKPAAOqqKAAA

AAJXFWAKPAAOqqKAA +

AAJXFWAKPAAOqqKAA /

为任何行创建后,它都是静态且唯一的。

我在边界查询中将此有趣的数据类型转换为其他内容

   ERROR tool.ImportTool: Encountered IOException running import job:

 java.io.IOException: Sqoop does not have the splitter for the given SQL

 data type. Please use either different split column (argument --split-by) 

or lower the number of mappers to 1. Unknown SQL data type: -8

但是随后我得到了丑陋的ROWID,这些ROWID被Oracle拒绝了:

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect

 jdbc:oracle:thin:@127.0.0.1:port:mydb  --username $USER --P --m 8

 --split-by ROWID --boundary-query "select cast(min(ROWID) as varchar(18)), cast

( max(ROWID)as varchar(18)) from table  where laufbzdt > 

TO_DATE('2019-02-27', 'YYYY-MM-DD')" --query "select * from table

where laufbzdt > TO_DATE('2019-02-27', 'YYYY-MM-DD') and \$CONDITIONS " 

--null-string '\\N' 

--null-non-string '\\N' 

如何正确解决此问题?

我是LINUX胚胎,到目前为止,我一直在痛苦地咀嚼着bash-shell-scripting和Sqooping的主题,但是我想更好地利用均匀分布的mapper-task工作负载-这样可以减少转换时间我猜可以节省一半到5到8个小时。

TIA!

1 个答案:

答案 0 :(得分:0)

您可以尝试 ROWNUM ,但是我认为sqoop importpseudocolumn不兼容。