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

时间:2019-02-13 19:52:32

标签: python apache-spark pyspark informix

我正在使用PySpark的read方法从各种JDBC源读取数据。从Teradata,mySQL,Oracle,SQL Server读取的JDBC都可以100%工作,但是,我现在正尝试从Informix读取,结果是 列值 < / strong>代替实际数据:

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正确返回:

enter image description here

我无法想象会导致这种情况的任何机制。谁能建议我从哪里开始寻找问题?

1 个答案:

答案 0 :(得分: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会有其他影响,因此请确保它可以执行您想要的操作,但是打开它应该没问题。