当阅读类型为BigInt
的MySQL列(例如下面的BIGINT(21) UNSIGNED
)时,Spark无法将java.math.BigDecimal
投射到以下代码段中的String
:
val driver = "com.mysql.jdbc.Driver"
val server = ...
val infoSchema = "INFORMATION_SCHEMA"
val port = 3306
val user = ...
val pw = ...
val dbUrl = s"jdbc:mysql://$server:$port/$infoSchema"
val dbProperties = new java.util.Properties()
dbProperties.setProperty("driver", driver)
dbProperties.setProperty("user", user)
dbProperties.setProperty("password", pw)
val schema = ...
val table = ...
val cols = sqlContext.read.jdbc(dbUrl, "COLUMNS", dbProperties)
.filter(col("TABLE_SCHEMA") === schema && col("TABLE_NAME") === table)
.map(_.getValuesMap[String](Seq("ORDINAL_POSITION", "COLUMN_NAME")))
.collect()
.toList
cols.map(e => e("COLUMN_NAME"))
cols.map(e => e("ORDINAL_POSITION")) // java.math.BigDecimal cannot be cast to java.lang.String
但是,当我执行以下操作时,没有问题:
val num = new java.math.BigDecimal(1)
num.toString
这是一个错误还是我错过了什么?
答案 0 :(得分:2)
Row.getValuesMap[T]
不用于类型转换。相反,它明确指出值类型为T
(内部只有get
跟{4}},asInstanceOf[T]
显然不是BigDecimal
。
你可以:
String
。在映射之前使用SQL强制转换。
_.getValuesMap[Any]
但老实说,所有这些选项都相当丑陋,直接提取价值更有意义:
withColumn("ORDINAL_POSITION", $"ORDINAL_POSITION".cast(StringType))