Sqoop创建包含多个记录的insert语句

时间:2013-07-17 13:41:37

标签: hadoop mapreduce sqoop

我们正在尝试将数据从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)。

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

非常感谢您的帮助。

2 个答案:

答案 0 :(得分: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.。)第三,您必须添加 - 批次,使用批处理模式执行基础语句。

所以你最后的导出会是这样的,

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

希望这会有所帮助。

答案 1 :(得分:1)

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

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

我建议你也看一下Apache Sqoop Cookbook,其中描述了这个和许多其他提示。