Informix JDBC PySpark 将列名中的结果作为列值读取

Posted

技术标签:

【中文标题】Informix JDBC PySpark 将列名中的结果作为列值读取【英文标题】:Informix JDBC PySpark Read Results in Column Names as Column Values 【发布时间】:2019-02-13 19:52:31 【问题描述】:

我正在使用 PySpark 的 read 方法从各种 JDBC 源读取数据。从 Teradata、mysql、Oracle、SQL Server 读取的 JDBC 都在 100% 工作,但是,我现在尝试从 Informix 读取,结果是 列值中的列标题 代替实际数据:

query_cbu = '''
SELECT first 5 
ac2_analysis_p
FROM informix.ac2_aux_cust
        '''

指定标题选项没有帮助:

df_cbu = \
      spark.read.format("jdbc") \
      .option("url", url) \
      .option("dbtable", '() tbl'.format(query_cbu)) \
      .option("user", db_username) \
      .option("password", db_password) \
      .option("header", "true") \
      .load()

df_cbu.show()

结果:

+--------------+
|ac2_analysis_p|
+--------------+
|ac2_analysis_p|
|ac2_analysis_p|
|ac2_analysis_p|
|ac2_analysis_p|
|ac2_analysis_p|
+--------------+
        

使用相同的 jdbc 驱动程序 (ifxjdbc.jar) 值从 DBVisualiser 正确返回:

我无法想象有什么机制会导致这种情况。谁能告诉我从哪里开始寻找问题?

【问题讨论】:

Why you shouldn't post pictures of code/data。请edit您的问题在问题正文中包含代码和输出。但是根据您的标题,我猜您需要将header 选项设置为true(默认为false)。 @pault 谢谢,我试图放置代码,但它会导致转义字符等的技巧来合并引号,也很高兴显示 Jupyternotebook 和 DbVisualizer 的用户界面的上下文提供。不幸的是,将 header 选项设置为 true 并没有什么不同。感谢您的宝贵时间。 【参考方案1】:

我确实相信(我在前一段时间之前看到过一次,所以从这里回忆)你需要在你的 JDBC 驱动程序 URL 中启用 DELIMIDENT。

DELIMIDENT=Y

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.jdbc_pg.doc/ids_jdbc_040.htm#ids_jdbc_040

原因是,虽然其他 JDBC 驱动程序已经在 Spark 所追求的元数据中引用了用户名/表名,但 Informix JDBC 没有,这会混淆 Sparks JDBC 层。在驱动程序中启用 DELIMIDENT 会添加这些。使用 DELIMIDENT 还会产生其他影响,因此请确保它执行您想要的操作,但打开它应该没问题。

【讨论】:

以上是关于Informix JDBC PySpark 将列名中的结果作为列值读取的主要内容,如果未能解决你的问题,请参考以下文章

将 Informix JDBC 添加到 Jasper 服务器

PySpark:如何将数据框与存储在其他变量中的列名连接起来

Informix java.lang.ClassNotFoundException: com.informix.jdbc.IfxDirectConnection

informix jdbc 卡住了连接

带有列名的pyspark随机森林分类器特征重要性

使用 Dataframes 从 Informix 到 Spark 的 JDBC