1

对于 jdbc 数据帧,如果我指定一个自定义查询,例如

(select * from table1 where col4 > 10.0) AS table1

然后所有列的架构都可以为 null = false

col1: string (nullable = false)
col2: string (nullable = false)
col3: string (nullable = false)
col4: float (nullable = false)

当我使用自定义查询并且结果集包含任何空值时,这会导致空指针异常。我还尝试以编程方式转换模式,但由于火花谱系它仍然失败,因为原始数据框具有受限模式,而不管模式转换的数据框具有什么。

我找到了解决方法。如果我只提供表名,然后提供 select 和 where 子句

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 之后,这开始出现,在此之前它工作正常

4

2 回答 2

0

要关闭循环,此问题已在驱动程序版本中修复16.04.00.0。需要在连接字符串中添加两个新参数COLUMN_NAME=ON,MAYBENULL=ON

于 2020-01-21T18:38:14.440 回答
0

此问题与 Teradata JDBC 驱动程序有关。此问题在https://community.teradata.com/t5/Connectivity/Teradata-JDBC-Driver-returns-the-wrong-schema-column-nullability/mp/76667/highlight/true#M3798进行了讨论。

根本原因在第一页讨论。解决方案在第三页。

来自 Teradata 的人说他们在 16.10.* 驱动程序中使用 MAYBENULL 参数解决了这个问题,但我仍然看到不确定的行为。

这是一个类似的讨论 https://issues.apache.org/jira/browse/SPARK-17195

于 2017-11-15T18:54:40.630 回答