对于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之后,这开始出现了,之前它运行良好
答案 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。*驱动程序中的问题,但我仍然看到了一种不确定的行为。
答案 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