(请回答,这是我的第一个问题,我事先在这里和网上进行了广泛的研究。问题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!
答案 0 :(得分:0)
您可以尝试 ROWNUM ,但是我认为sqoop import
与pseudocolumn
不兼容。