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/

 

posted @ 2020-10-12 22:30  ericpan24  阅读(450)  评论(0编辑  收藏  举报