pyspark读写mongo的技巧和坑

技巧

每次把数据写入mongo,mongo都会自动创建_id字段,mongo中_id字段是唯一的,mongo会为这个字段自动建立索引。
写mongo之前可以指定_id的值,这样当你的写入mode是Append的时候,你的记录写入mongo,如果不存在该_id,那么就添加改记录,如果存在该_id,那就覆盖原来_id对应记录的值。
这样,比如你要往mongo里加4条记录,在你调试你的代码的时候,可以写这4条记录无数次,反正每次这4条记录都会被覆盖。

假设user表里有字段ID(唯一),name,income,要把该表写入mongo

mongo_url = "mongodb://username:password@hostIP:port/dbname"

spark.sql("select ID as _id,* from user").format("com.mongodb.spark.sql").option("spark.mongodb.output.uri", mongo_url).option("collection", "user_table").mode("Append").save()

mongo的坑:(decimal数据类型)

源于工作中的一次生产事故。
当mongo数据库里存着bigDecimal数据类型,pyspark读取大于等于100000的数值,有时候能读到,有时候读不到。而且是要不所有大于100000的值都读到,要不所有大于100000的值都读不到(读成null),读到读不到的比率大约为1:3。
所以写mongo时,数据类型尽量不要用decimal,用int或者string保险

开发pyspark脚本时,如果可以,先把计算结果写入hdfs,再写入mongo。直接写入mongo可能有丢数据的情况。综合来讲,我就是觉得mongo不太靠谱🙂

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值