使用 Dataframes 从 Informix 到 Spark 的 JDBC

Posted

技术标签:

【中文标题】使用 Dataframes 从 Informix 到 Spark 的 JDBC【英文标题】:JDBC From Informix to Spark using Dataframes 【发布时间】:2016-01-25 19:06:07 【问题描述】:

我可以使用简单的 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)

【问题讨论】:

请粘贴您的 spark 提交命令和异常堆栈 @ShawnGuo:已添加异常堆栈跟踪,但未添加 Spark 提交命令。 不幸的是,我理解日食是一段黑暗时期,这表明我对日食了解多少;我会拼写Java——c、o、f、f、e、e;火花是炽热材料的小白炽闪光:这些都不能帮助我将其组装成一个连贯的机制来访问 Informix 数据库。 Je ne sais quoi 等。抱歉,我帮不上什么忙。 我正在通过 Eclipse @ShawnGuo 中的独立 Java 程序访问 Spark 中的 Informix 数据 从堆栈跟踪看来,有与 Informix 数据库的连接。问题可能在于从 Informix 读取数据。 Spark 调用 getNext() 调用 getLong()getLong() 接收无法解析为数字的“table_name”。 【参考方案1】:

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

DELIMIDENT=Y

【讨论】:

我知道回复晚了。但它对我有用。谢谢【参考方案2】:

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

问题可能在于从 Informix 读取数据。 Spark 调用 getNext() 调用 getLong()getLong() 接收无法解析为数字的“table_name”。

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

【讨论】:

以上是关于使用 Dataframes 从 Informix 到 Spark 的 JDBC的主要内容,如果未能解决你的问题,请参考以下文章

将 schema 和 SP 从 informix 迁移到 mysql

通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑

如何从 Perl 调用 Informix 存储过程?

从 Windows 通过 Entity Framework 连接到 Informix 的问题

从两个 Pandas DataFrames 向数据帧添加一列,当前使用两个带有条件的循环:有更快的方法吗?

如何将数据从 Informix 实时推送到 .NET 服务器?