Spark 从 IBM Informix 数据库读取数据“在日期值的字符串表示中指定的标记不足”

Posted

技术标签:

【中文标题】Spark 从 IBM Informix 数据库读取数据“在日期值的字符串表示中指定的标记不足”【英文标题】:Spark reading data from IBM Informix database "Not enough tokens are specified in the string representation of a date value" 【发布时间】:2017-01-02 08:42:55 【问题描述】:

我尝试使用以下语法连接到 Spark 中的 Informix 数据库。

jdbcDF = sqlContext.read.format("jdbc").option("url", "jdbc:informix-sqli://192.168.x.xx:xxxx/INFORMIXSERVER=online").option("dbtable", "informix.detail").option("user", "user").option("password", "xxxxxx").option('driver','com.informix.jdbc.IfxDriver').load()

连接成功,我可以看到数据框的架构。

jdbcDF.printSchema() 

   root
 |-- mobile_no: string (nullable = false)
 |-- subscriber_code: string (nullable = false)
 |-- connected_date: date (nullable = true)
 |-- disconnected_on: date (nullable = true)
 |-- att0: string (nullable = true)

但是当从数据框中检索数据时,

jdbcDF.show()

我收到以下错误。

在 a 的字符串表示中指定的标记不足 日期值。 “断开连接”

我在网上发现了同样的问题, IBM Knowledge Center 它说我需要更改 Informix 数据库中的数据库列,但在我的情况下这是不可能的。

在从 informix 表加载之前,我有什么方法可以将“disconnected_on”字段转换为数据帧中的字符串?

【问题讨论】:

【参考方案1】:

为了投一列,你可以使用cast()

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.Column.cast

>>> df.select(df.age.cast("string").alias('ages')).collect()
[Row(ages=u'2'), Row(ages=u'5')]

您可以使用 drop() 删除旧列

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html

drop(*cols)

Returns a new DataFrame that drops the specified column. This is a no-op if schema doesn’t contain the given column name(s).
Parameters: cols – a string name of the column to drop, or a Column to drop, or a list of string name of the columns to drop.

>>> df.drop('age').collect()
[Row(name=u'Alice'), Row(name=u'Bob')]

>>> df.drop(df.age).collect()
[Row(name=u'Alice'), Row(name=u'Bob')]

结合这两个函数,你可以添加一个新列disconnected_on_str,即disconnected_oncaststringdrop旧列disconnected_on

jdbcDF_cast = jdbcDF.withColumn("disconnected_on_str", jdbcDF["disconnected_on"].cast("string")).drop("disconnected_on")

【讨论】:

以上是关于Spark 从 IBM Informix 数据库读取数据“在日期值的字符串表示中指定的标记不足”的主要内容,如果未能解决你的问题,请参考以下文章

IBM Informix-SQL 语法错误,从 Microsoft BIDS 到 Cisco UCCX 数据库的基本查询

使用 Dataframes 从 Informix 到 Spark 的 JDBC

尝试使用 JDBC 连接到 IBM 的 Informix docker 版本

在 IBM.Data.Informix 2.81.0.0 中找不到 IfxBulkCopy

FineBI学习系列之FineBI与IBM Informix数据连接(图文详解)

无法将 Spring Boot 应用程序连接到 IBM Informix 数据库