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

时间:2017-01-20 18:53:14

标签: apache-spark jdbc apache-spark-sql spark-dataframe apache-spark-2.0

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

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

然后所有列的模式都变为nullable = 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之后,这开始出现了,之前它运行良好

2 个答案:

答案 0 :(得分:0)

此问题与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

答案 1 :(得分:0)

要结束循环,此问题已在驱动程序版本 ID cty cty_ptn prod_code Quantity1 Quantity2 prod_label 0 E AR ALBANIA 20230 45 84 Gas 1 E AUC PAKISTN 20220 68 10 Water 2 E CA UGANDA 20120 48 45 Oil 3 I CN FRANCE 20230 11 93 Gas 4 E MX USA 20230 62 81 Gas 5 E MX RUSSIA 20220 27 49 Water 6 I AR COLOMBIA 20230 55 97 Gas 7 I IT KAZAK 20120 32 93 Oil 8 E UK KOREA 20130 63 88 NaN 9 I RU JAPAN 20329 99 39 NaN 中修复。需要在连接字符串16.04.00.0

中添加两个新参数