mongo批量插入问题(insert_many,bulk_write),spark df转json传入mongo
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的更多相关文章
- mybatis的插入与批量插入的返回ID的原理
目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...
- MongoDB学习笔记~批量插入方法的实现
回到目录 批量插入在EF时代大叔就自己封装过,原理是将多次SQL连接和多次向SQL发送的指令减少到1次,或者1000条数据1次,而对于EF产生的语句来说,这无疑是性能高效的,因为EF这边在处理时,每个 ...
- MongoDB不支持批量插入
mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...
- mongo批量更新、导入导出脚本
批量更新,一定要加上最后的条件: db.getCollection('cuishou_user').update( {,,,,,]}}, //query {$set:{)}},// update {m ...
- mongodb批量插入数据
年前由于公司业务需要,后台需要获取流水记录,需要每天定时跑脚本,将流水记录跑入库里边,每天大概有个一百万左右,使用的数据库是mongodb,考虑到一条一条录入数据,100多万会跑断,就想着批量录入数据 ...
- sqlalchemy ORM进阶- 批量插入数据
参考: https://www.jb51.net/article/49789.htm https://blog.csdn.net/littlely_ll/article/details/8270687 ...
- 将大量数据批量插入Oracle表的类,支持停止续传
之前用create table select * from XXTable无疑是创建庞大表的最快方案之一,但是数据重复率是个问题,且数据难以操控. 于是我在之前批量插数据的基础上更新了一个类,让它具有 ...
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
随机推荐
- HTMLCollection对象和NodeList对象
前言 首先我们先来看下面的demo,假如我们需要给所有的li字体变一个颜色. <!DOCTYPE html> <html lang="en"> <he ...
- Warning:detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
执行kubeadm init集群初始化时遇到: [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker ...
- 鸟哥私房菜基础篇:磁碟配额(Quota)与进阶文件系统管理习题
猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0420quota.php 1-在前一章的第一个大量新增帐号范例中, 如果我想要让每个用户均具有 soft ...
- 网站后台扫描工具dirbuster、御剑的用法
dirbuster DirBuster是Owasp(Open Web Application Security Project )开发的一款专门用于探测网站目录和文件(包括隐藏文件)的工具.由于使用J ...
- nginx 代理 registry docker certificate is valid for k8s, not
1.配置SSL证书及nginx反向代理docker registry 搭建私有CA,初始化CA环境,在/etc/pki/CA/下建立证书索引数据库文件index.txt和序列号文件serial,并为证 ...
- The import javax.websocket cannot be resolved的解决问题
在eclipse中导入项目的时候出现了这个问题,废了我半天劲,才搞明白,把问题记录下来,方便大家以后遇到这问题好处理.提供参考. 出现的问题截图: 因为我用的是tomcat8, 大体步骤:项目上点右键 ...
- SQLite基础-8.子句(二)
目录 SQLite子句(二) 1. GROUP BY子句 2. HAVING子句 3. LIMIT 子句 4. IF EXISTS 和 IF NOT EXISTS 子句 SQLite子句(二) 1. ...
- ABP领域层创建实体
原文作者:圣杰 原文地址:ABP入门系列(2)——领域层创建实体 在原文作者上进行改正,适配ABP新版本.内容相同 这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进 ...
- Linux系列(0):入门之Linux版本说明以及用户登录与切换
你知道你登录时所在目录吗? 知道根目录下有哪些子目录吗? 知道如何切换用户吗? 知道如何添加用户吗? 如果你不知道,那就可以了解一下本章节啦! 前言:你知道Linux有多少发行版吗,如下图所示: 1. ...
- 文件操作:w,w+,r,r+,a,wb,rb
1.文件操作是什么? 操作文件: f = open("文件路径",mode="模式",encoding="编码") open() # 调用操 ...