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_on
cast
为string
,drop
旧列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