对于 jdbc 数据帧,如果我指定自定义查询,例如
(select * from table1 where col4 > 10.0) AS table1
然后所有列的架构结果都是可为空的 = 假
col1: string (nullable = false)
col2: string (nullable = false)
col3: string (nullable = false)
col4: float (nullable = false)
当我使用自定义查询并且结果集包含任何空值时,这会导致空指针异常。我还尝试以编程方式转换架构,但由于火花谱系,它仍然失败,因为无论转换后的数据帧具有什么架构,原始数据帧都具有受限的架构。
我为此找到了解决方法。如果我只提供表名,然后提供选择和位置子句
sqlContext.read.jdbc(url, table1, dconnectionProperties).
select("col1", "col2", "col3", "col4").
where(s"col4 < 10.0")
架构被正确(或我想要的方式)推断为
col1: string (nullable = true)
col2: string (nullable = true)
col3: string (nullable = true)
col4: float (nullable = true)
但是我想使用自定义查询,因为我的查询有一些连接和聚合,我希望将其推送到数据库以执行。
在我们移动到 Spark 2.0.x 之后,这开始出现
此问题与 Teradata JDBC 驱动程序有关。这个问题在 https://community.teradata.com/t5/Connectivity/Teradata-JDBC-Driver-returns-the-wrong-schema-column-nullability/m-p/76667/highlight/true#M3798 讨论。
根本原因在第一页上讨论。解决方案在第三页上。
来自 Teradata 的人说他们使用 MAYBENULL 参数修复了 16.10.* 驱动程序中的问题,但我仍然看到不确定的行为。
这是一个类似的讨论https://issues.apache.org/jira/browse/SPARK-17195
为了关闭循环,此问题已在驱动程序版本 16.04.00.0
中修复。需要在连接字符串中添加两个新参数COLUMN_NAME=ON,MAYBENULL=ON