使用Dataframes从Informix到Spark的JDBC

时间:2016-01-25 19:06:07

标签: apache-spark apache-spark-sql spark-dataframe informix

我可以使用简单的JDBC连接程序连接到Informix数据库,但是当我尝试使用Spark Dataframes加载表时,我遇到了异常。我们是否需要为Informix spark连接使用特定的连接器?

以下是异常的堆栈跟踪:

java.sql.SQLException: System or internal error java.lang.NumberFormatException: For input string: "table_name"
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:482)
at com.informix.jdbc.IfxChar.toLong(IfxChar.java:666)
at com.informix.jdbc.IfxResultSet.getLong(IfxResultSet.java:1123)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$$anon$1.getNext(JDBCRDD.scala:411)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$$anon$1.hasNext(JDBCRDD.scala:472)
at org.apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:241)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1$$anonfun$apply$mcV$sp$3.apply(InsertIntoHadoopFsRelation.scala:150)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1$$anonfun$apply$mcV$sp$3.apply(InsertIntoHadoopFsRelation.scala:150)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:88)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

2 个答案:

答案 0 :(得分:2)

当Spark生成数据库查询时,它会将列名称放在引号中。为了适应这种情况,您需要在JDBC连接URL中添加

DELIMIDENT=Y

答案 1 :(得分:1)

从堆栈跟踪看来,似乎存在与Informix数据库的连接。

问题可能在于从Informix读取数据。 Spark调用getNext(),调用getLong()getLong()重新获得' table_name '无法解析为数字。

我不知道Spark。也许添加一些关于如何使用Spark的细节(可能是代码)。