Informix JDBC PySpark 读取列名中的结果作为列值
Informix JDBC PySpark Read Results in Column Names as Column Values
我正在使用 PySpark 的读取方法从各种 JDBC 来源读取数据。 JDBC 从 Teradata 读取,mySQL,Oracle,SQL 服务器都在 100% 工作,但是,我现在正在尝试从 Informix 读取,结果是列 headers 在 列值 而不是实际数据:
query_cbu = '''
SELECT first 5
ac2_analysis_p
FROM informix.ac2_aux_cust
'''
指定 header 选项没有帮助:
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 driver (ifxjdbc.jar) 值从 DBVisualiser 正确返回:
我想不出有什么机制会导致这种情况。谁能告诉我从哪里开始寻找问题?
我相信(我之前看过一次,所以从这里的记忆)你需要在你的 JDBC 驱动程序 URL 中启用 DELIMIDENT。
DELIMIDENT=Y
原因是,虽然其他 JDBC 驱动程序已经在 Spark 所追求的元数据中引用了 username/table 名称,但 Informix JDBC 却没有,这让 Sparks JDBC 感到困惑层。在驱动程序中启用 DELIMIDENT 会添加这些。使用 DELIMIDENT 还有其他影响,因此请确保它能按照您的意愿行事,但打开它应该没问题。
我正在使用 PySpark 的读取方法从各种 JDBC 来源读取数据。 JDBC 从 Teradata 读取,mySQL,Oracle,SQL 服务器都在 100% 工作,但是,我现在正在尝试从 Informix 读取,结果是列 headers 在 列值 而不是实际数据:
query_cbu = '''
SELECT first 5
ac2_analysis_p
FROM informix.ac2_aux_cust
'''
指定 header 选项没有帮助:
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 driver (ifxjdbc.jar) 值从 DBVisualiser 正确返回:
我想不出有什么机制会导致这种情况。谁能告诉我从哪里开始寻找问题?
我相信(我之前看过一次,所以从这里的记忆)你需要在你的 JDBC 驱动程序 URL 中启用 DELIMIDENT。
DELIMIDENT=Y
原因是,虽然其他 JDBC 驱动程序已经在 Spark 所追求的元数据中引用了 username/table 名称,但 Informix JDBC 却没有,这让 Sparks JDBC 感到困惑层。在驱动程序中启用 DELIMIDENT 会添加这些。使用 DELIMIDENT 还有其他影响,因此请确保它能按照您的意愿行事,但打开它应该没问题。