Spark 1.4.1:读取MySQL BigInt列时出现问题

时间:2016-08-22 13:23:45

标签: mysql apache-spark

当阅读类型为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

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

Row.getValuesMap[T]不用于类型转换。相反,它明确指出值类型为T(内部只有get跟{4}},asInstanceOf[T]显然不是BigDecimal

你可以:

  • 添加隐式转化。
  • 使用String
  • 在映射之前使用SQL强制转换。

    _.getValuesMap[Any]

但老实说,所有这些选项都相当丑陋,直接提取价值更有意义:

withColumn("ORDINAL_POSITION", $"ORDINAL_POSITION".cast(StringType))