spark dataframe 插入 mongoDB 报错 MongoTypeConversionException: Cannot cast 0 into a BsonValue. ByteType has no matching BsonValue
第一次接触mongoDB ,spark 读kudu的表数据 使用mongo-spark-connector 插入mongoDB。
针对源表数据字段类型为tinyint 和 smallint 时 spark读入的DF会自动设置其类型为ByteType 和shortType 。直接插入mongoDB会出现BsonValue 不存在对应类型的情况。此处关于mongo的存储方式暂时不是太了解。
对df可能为不匹配的类型做个强制转换 就可以解决问题
import org.apache.spark.sql.types._ var dfrslt = df for( (colName,colType) <- dfrslt.dtypes if Seq("ByteType","ShortType").contains(colType) ){ dfrslt = dfrslt.withColumn(colName,col(colName).cast(IntegerType)) }
对于mongoDB 实现upsert 追加或更新 通过将主键 pk 字段 重命名为“_id”来实现
if(!keyCol.isEmpty){ dfrslt = dfrslt.withColumnRenamed(keyCol,"_id") }
参考 https://stackoverflow.com/questions/45505897/spark-scala-use-spark-mongo-connector-to-upsert
另外参考官网 注意各组件 版本匹配 https://docs.mongodb.com/spark-connector/master/