0. 问题简述
mogo原生数据
用spark取抽取过来之后老是报这个错误
Cannot cast INT32 into a NullType类型转换异常
Cannot cast STRING into BooleanType 类型转换异常
阅读官方文档:
1. sampleSize 设置参数可以解决部分问题
mogo为非关系型数据库,相同的字段会存不同的类型的值,
sampleSize这个参数在抽取的时候会默认取1000个样本,null的数据到达一定数量以后就会将原来的int转为null,从而出现以上错误,(具体是多少数量未知),
问题解决:
将sampleSize设为20000,样本数量足够大的时候,int的值达到一定数量,抽取时就会将null转为int还是integer,就有很大可能不会出现以上错误,
随取样的差异,任务任然存在失败的风险。。。。。
2. 要是设置参数依然无法解决,那么请检查你pom文件中的这三个依赖的版本跟你的spark,MongoDB的版本是否对应(2020-07-11更新)
org.mongodb.spark.mongo-spark-connector_版本的对应关系传送门:
https://docs.mongodb.com/spark-connector/master/
org.mongodb.mongo-java-driver的版本传送门:
https://mvnrepository.com/artifact/org.mongodb/mongodb-driver
这是我原来依赖的版本:
<groupId>org.mongodb.spark</groupId>
<artifactId>mongo-spark-connector_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.8.0</version>
</dependency>
修改后的版本
<dependency>
<groupId>org.mongodb.spark</groupId>
<artifactId>mongo-spark-connector_2.11</artifactId>
<version>2.3.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.3</version>
</dependency>
3. 经过以上的一波操作,问题还是没解决,过几天同样的错误又出现了(2020-07-16更新)
一开始我是用dataframe的api去读MongoDB的数据,各种改,问题还是没有解决
val createdinfo = MongoSpark.load(spark, readcfgAdminuser)
最后用rdd的api读MongoDB的数据
val info = MongoSpark.load(spark.sparkContext, readcfgAdminuser1)
问题才得以解决,具体为什么dataframe会报类型转换异常,而rdd就不会,原因不为而知,待探索,具体还会出现什么问题,待续。。。。。。。