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

在Spark处理DataFrame时,经常遇到'cannot be cast to'错误,主要是数据源与代码中指定类型不匹配。本文以MySQL为例,说明如何在读取和保存数据时匹配数据格式,避免ClassCastException。例如,MySQL的decimal字段需转换为BigDecimal,保存CSV时需确保DataFrame的Schema与数据类型一致。
最低0.47元/天 解锁文章
4866

被折叠的 条评论
为什么被折叠?



