2

我们正在尝试将数据从 sqoop 加载到 netezza。我们正面临以下问题。

java.io.IOException: org.netezza.error.NzSQLException: ERROR:

示例输入数据集如下所示:

1,2,3

1,3,4

sqoop 命令如下图所示:

sqoop export --table <tablename> --export-dir <path> 
--input-fields-terminated-by '\t' --input-lines-terminated-by '\n' --connect
'jdbc:netezza://<host>/<db>' --driver org.netezza.Driver 
--username <username> --password <passwrd>

Sqoop 正在通过以下方式创建插入语句:

插入 (c1,c2,c3) 值 (1,2,3),(1,3,4)。

我们可以加载一条记录,但是当我们尝试将数据加载到多条记录时,错误如上所述。

非常感谢您的帮助。

4

2 回答 2

5

使sqoop.export.records.per.statement=1肯定会有所帮助,但如果您的导出记录数非常大,例如“500 万”,这将使导出过程非常缓慢。

要解决这个问题,您需要添加以下内容:

1.) 一个属性文件sqoop.properties,它必须包含这个属性jdbc.transaction.isolation=TRANSACTION_READ_UNCOMMITTED(它避免了导出过程中的死锁)

同样在导出命令中,您需要指定:

--connection-param-file /path/to/sqoop.properties

2.) 还有sqoop.export.records.per.statement=100,这样会提高导出速度。

3.)第三,你必须添加--batch,使用批处理模式执行底层语句。

所以你最终的导出看起来像这样,

sqoop export -D sqoop.export.records.per.statement=100 --table <tablename> --export-dir <path> 
--input-fields-terminated-by '\t' --input-lines-terminated-by '\n' --connect
'jdbc:netezza://<host>/<db>' --driver org.netezza.Driver 
--username <username> --password <passwrd>
--connection-param-file /path/to/sqoop.properties
--batch

希望这会有所帮助。

于 2013-07-24T23:13:55.693 回答
1

您可以使用属性“sqoop.export.records.per.statement”自定义将在一个插入语句中使用的行数。例如,对于 Netezza,您需要将其设置为 1:

sqoop 导出 -Dsqoop.export.records.per.statement=1 --connect ...

我建议你也看看Apache Sqoop Cookbook,其中描述了这个和许多其他技巧。

于 2013-07-18T14:26:34.010 回答