spark处理dataframe数据时,往往遇到"...cannot be cast to ..."这种数据不匹配的问题,主要是因为我们代码中spark指定的数据类型和数据源类型不一致。这里以MySQL为数据源为例。
一、读取数据格式匹配
MySQL表的创建语句指定的数据类型有decimal、varchar、datetime等。
CREATE TABLE `customfieldvalue` (
`ID` decimal(18,0) NOT NULL,
`ISSUE` decimal(18,0) DEFAULT NULL,
`CUSTOMFIELD` decimal(18,0) DEFAULT NULL,
`PARENTKEY` varchar(255) DEFAULT NULL,
`STRINGVALUE` varchar(255) DEFAULT NULL,
`NUMBERVALUE` decimal(18,6) DEFAULT NULL,
`TEXTVALUE` longtext,
`DATEVALUE` datetime DEFAULT NULL,
`VALUETYPE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `cfvalue_issue` (`ISSUE`,`CUSTOMFIELD`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("ETL") conf.setMaster("local") val sc = new SparkContext(conf) val sqlContext = new SQLContext(sc) //从MySQL中获取数据 val url = "jdbc:mysql://192.168.xxx.xxx:3306/jira?user=xxxx&password=xxxx" val prop = new Properties() //加载整个表 val customfieldvalue = sqlContext.read.jdbc(url, "customfieldvalue", prop) val customfieldvalue2 = customfieldvalue.map { line => val ID = line.getAs[Double]("ID") //问题所在 val ISSUE = line.getAs[BigDecimal]("ISSUE") val CUSTOMFIELD = line.getAs[BigDecimal]("CUSTOMFIELD") val PARENTKEY = line.getAs[String]("PARENTKEY") val STRINGVALUE = line.getAs[String]("STRINGVALUE") val NUMBERVALUE = li