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中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
随机推荐
- STS中依赖项的设置
经过试验,把依赖项总结一下,可能会不断修改. 1. 父依赖项(固定) <parent> <groupId>org.springframework.boot</groupI ...
- 修改Mysql 数据库的密码
1.修改my.cnf 在这个文件里面加入 skip-grant-tables 修改之后,保存.然后重启数据库 2.由于我的系统是Centos7 ,数据库是mariadb ,所以执行命令如下: 3.重启 ...
- kubeadm快速安装k8s
1.安装net-tools [root@localhost ~]# yum install -y net-tools 2.关闭firewalld [root@localhost ~]# systemc ...
- Windows主机SAM文件格式破解解密
文件格式如是下图这种格式: 那么就可以通过通过kali终端samdump2 + system + sam 生成出来通过hashcat -m 1000去跑,或者通过md5查询
- [转帖]Breeze部署kubernetes1.13.2高可用集群
Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernet ...
- 【Python】【demo实验28】【练习实例】【递归函数练习】
原题: 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他说是10岁.请 ...
- 【Python】【demo实验9】【练习实例】【三数排序】
原题: 输入三个整数x,y,z,请把这三个数由小到大输出. 我的解法: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 输入三 ...
- Oracle通过正则表达式分割字符串 REGEXP_SUBSTR
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string ...
- Eclipse中 coverage as 测试代码覆盖率
eclipse 版本: Version: 2019-06 (4.12.0)Build id: 20190614-1200 绿色:代码被执行过黄色:代码部分被执行过红色:代码没有被执行过 引用: htt ...
- jstl与EL表达式
一·el表达式介绍 EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} ...