在 Spark 2.0 中,jdbc 数据帧架构自动应用为可为空 = false



对于 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

相关内容

  • 没有找到相关文章

最新更新