https://blog.csdn.net/nihaoxiaocui/article/details/95060906

https://xuexiyuan.cn/article/detail/173.html

from etlsdk.lib.datasources.datasource_factory import DatasourceFactory
from data_pipeline.df_transform.transform import DataframeTransform
from data_pipeline.utils.utils import get_extractor_cls
import json
import math
from pymongo import MongoClient, ReplaceOne, InsertOne class CommonMongodbPlugin(object):
"""
提供dataframe 转化为新的dataframe 并写入mongodb数据库,
""" def write2mongo(self, iterator):
      # x.asDict() 将每一行转化为字典类型
result_list = []
for x in iterator:
if self.id:
result_list.append(ReplaceOne({'_id': x.asDict()[self.id]}, x.asDict(), upsert=True))
else:
result_list.append(InsertOne(x.asDict()))
if len(result_list) > 0:
client = MongoClient(self.mongo_url)
collection = client.get_database(self.mongo_db)[self.mongo_collection]
collection.bulk_write(result_list, ordered=False, bypass_document_validation=True) def run(self, inputs, outputs, args):
"""
根据tdate删除es中的数据
python3 -m etlsdk.main data_pipeline.plugins.bluebook.common_parsed2mongodb.CommonMongodbPlugin.run\
--input input_table:name=OSS_default:amazoncrawl:Jingji21/\
--partition "2019-11-07 10:00:00"\
--args keys:'["item_id","article_id","content","title","site","news_url","summary","create_time"]'\
--args mongo:'{"mongo_url": "mongodb://用户名:密码@ip:端口号/连接库名字","mongo_db":"库名","mongo_collection":"表名"}'\
--args extractor:data_pipeline.extractors.blue_book.jingji21.Jingji21Extractor\
--args _id:"item_id"
"""
input_df = inputs['input_table']['df']
# 获取Extractor "data_pipeline.extractors.blue_book.jingji21.Jingji21Extractor"
ExtractorCls = get_extractor_cls(args["extractor"]) # get_extractor_cls() 获取Extractor处理类 keys = args["keys"] if isinstance(args["keys"], list) else json.loads(args["keys"]) # 列名输出的df的字段列表
self.id = args.get("_id")
class Extractor(ExtractorCls): # 继承ExtractorCls
namespace = args.get("namespace", 'production')
columns_selected = None
df = DataframeTransform.struct2struct(input_df, Extractor, keys, columns_selected)
mymongo = args["mongo"] if isinstance(args["mongo"], dict) else json.loads(args["mongo"])
self.mongo_url = mymongo["mongo_url"]
self.mongo_db = mymongo["mongo_db"]
self.mongo_collection = mymongo["mongo_collection"]
df_count = df.count()
partition_number = math.ceil(df_count / 500)
if partition_number != 1:
df = df.repartition(partition_number)
df.foreachPartition(self.write2mongo) # 遍历 partition

mongo批量插入问题(insert_many,bulk_write),spark df转json传入mongo的更多相关文章

  1. mybatis的插入与批量插入的返回ID的原理

    目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...

  2. MongoDB学习笔记~批量插入方法的实现

    回到目录 批量插入在EF时代大叔就自己封装过,原理是将多次SQL连接和多次向SQL发送的指令减少到1次,或者1000条数据1次,而对于EF产生的语句来说,这无疑是性能高效的,因为EF这边在处理时,每个 ...

  3. MongoDB不支持批量插入

    mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...

  4. mongo批量更新、导入导出脚本

    批量更新,一定要加上最后的条件: db.getCollection('cuishou_user').update( {,,,,,]}}, //query {$set:{)}},// update {m ...

  5. mongodb批量插入数据

    年前由于公司业务需要,后台需要获取流水记录,需要每天定时跑脚本,将流水记录跑入库里边,每天大概有个一百万左右,使用的数据库是mongodb,考虑到一条一条录入数据,100多万会跑断,就想着批量录入数据 ...

  6. sqlalchemy ORM进阶- 批量插入数据

    参考: https://www.jb51.net/article/49789.htm https://blog.csdn.net/littlely_ll/article/details/8270687 ...

  7. 将大量数据批量插入Oracle表的类,支持停止续传

    之前用create table select * from XXTable无疑是创建庞大表的最快方案之一,但是数据重复率是个问题,且数据难以操控. 于是我在之前批量插数据的基础上更新了一个类,让它具有 ...

  8. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  9. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

随机推荐

  1. uni-app 使用本地打包配置安卓原生插件

    在使用 uni-app 开发的时候,遇到了一个很棘手的问题.即获取设备参数的时候 uni-app 并没有相关方法,而安卓开发是可以做到的,因为接的是三方推广,所以功能必须实现,所以求助了安卓的大佬帮我 ...

  2. 安装ceilometer

    在控制节点上执行 #!/bin/bash MYSQL_ROOT_PASSWD='m4r!adbOP' GNOCCHI_PASSWD='gnocchi1234!' CEILOMETER_PASSWD=' ...

  3. 《ThinkPHP 5.0快速入门》 请求和响应

    1.请求对象 //传统调用$request = Request::instance();//实例化对象 $request->url();//获取当前的域名 //继承think\Controlle ...

  4. IntelliJ IDEA打jar时常遇见的问题

    1.打包的时候提示 manifest.mf already exists in vfs  解决方案:这个文件夹删除掉,再重新build打包即可 2. 第一个选择“extract to the targ ...

  5. FTL方面综述

    FTL 1.百度百科 http://baike.baidu.com/link?url=HJ94Rz2Td83V8OW-6dD_h_P8CZb9VFR6HznPDopY_SFdfXDaMriYcBm1X ...

  6. [转帖]云服务器使用CentOS、Debian、Ubuntu的哪个版本

    云服务器使用CentOS.Debian.Ubuntu的哪个版本 2018-09-09 12:32:45作者:ywnz稿源:云网牛站 https://ywnz.com/linuxyffq/2986.ht ...

  7. 【Python】【demo实验7】【练习实例】【完全平方数相关】

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  8. shell中防止意外发生的两个实用的设置

    set -o nounset set -o errexit set -o nounset 在默认情况下,遇到不存在的变量,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的 ...

  9. 谈谈Java中的集合list、set、map之间的区别

    参考文献:https://www.cnblogs.com/IvesHe/p/6108933.html 我这里只总结其区别,具体的说明,请查看参考文献,讲的很详细. A.list接口,实现子类有:arr ...

  10. Java基础题记录

    1. 装箱和拆箱 装箱:自动将基本数据类型转换为包装器类型即引用数据类型 拆箱:将包装器类型转换为基本数据类型 2. Java的8中基本数据类型 关键字 字节数 范围 默认值 boolelan 1by ...