pyspark操作MongoDB的方法步骤


Posted in Python onJanuary 04, 2019

如何导入数据

数据可能有各种格式,虽然常见的是HDFS,但是因为在Python爬虫中数据库用的比较多的是MongoDB,所以这里会重点说说如何用spark导入MongoDB中的数据。

当然,首先你需要在自己电脑上安装spark环境,简单说下,在这里下载spark,同时需要配置好JAVA,Scala环境。

这里建议使用Jupyter notebook,会比较方便,在环境变量中这样设置

PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS=notebook ./bin/pyspark
如果你的环境中有多个Python版本,同样可以制定你想要使用的解释器,我这里是python36,根据需求修改。

PYSPARK_PYTHON=/usr/bin/python36

pyspark对mongo数据库的基本操作 (๑• . •๑)

pyspark操作MongoDB的方法步骤

有几点需要注意的:

  • 不要安装最新的pyspark版本,请安装 pip3 install pyspark==2.3.2
  •  spark-connector 与平常的MongoDB写法不同,格式是: mongodb://127.0.0.1:database.collection
  • 如果计算数据量比较大,你的电脑可能会比较卡,^_^
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: zhangslob
@file: spark_count.py 
@time: 2019/01/03
@desc:
  不要安装最新的pyspark版本
  `pip3 install pyspark==2.3.2`
  更多pyspark操作MongoDB请看https://docs.mongodb.com/spark-connector/master/python-api/
"""

import os
from pyspark.sql import SparkSession

# set PYSPARK_PYTHON to python36
os.environ['PYSPARK_PYTHON'] = '/usr/bin/python36'

# load mongodb data
# 格式是:"mongodb://127.0.0.1:database.collection"
input_uri = "mongodb://127.0.0.1:27017/spark.spark_test"
output_uri = "mongodb://127.0.0.1:27017/spark.spark_test"

# 创建spark,默认使用本地环境,或者"spark://master:7077"
spark = SparkSession \
  .builder \
  .master("local") \
  .appName("MyApp") \
  .config("spark.mongodb.input.uri", input_uri) \
  .config("spark.mongodb.output.uri", output_uri) \
  .config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.11:2.2.0') \
  .getOrCreate()


def except_id(collection_1, collection_2, output_collection, pipeline):
  """
  计算表1与表2中不同的数据
  :param collection_1: 导入表1
  :param collection_2: 导入表2
  :param output_collection: 保存的表
  :param pipeline: MongoDB查询语句 str
  :return:
  """
  # 可以在这里指定想要导入的数据库,将会覆盖上面配置中的input_uri。下面保存数据也一样
  # .option("collection", "mongodb://127.0.0.1:27017/spark.spark_test")
  # .option("database", "people").option("collection", "contacts")

  df_1 = spark.read.format('com.mongodb.spark.sql.DefaultSource').option("collection", collection_1) \
    .option("pipeline", pipeline).load()

  df_2 = spark.read.format('com.mongodb.spark.sql.DefaultSource').option("collection", collection_2) \
    .option("pipeline", pipeline).load()

  # df_1有但是不在 df_2,同理可以计算df_2有,df_1没有
  df = df_1.subtract(df_2)
  df.show()

  # mode 参数可选范围
  # * `append`: Append contents of this :class:`DataFrame` to existing data.
  # * `overwrite`: Overwrite existing data.
  # * `error` or `errorifexists`: Throw an exception if data already exists.
  # * `ignore`: Silently ignore this operation if data already exists.

  df.write.format("com.mongodb.spark.sql.DefaultSource").option("collection", output_collection).mode("append").save()
  spark.stop()


if __name__ == '__main__':
  # mongodb query, MongoDB查询语句,可以减少导入数据量
  pipeline = "[{'$project': {'uid': 1, '_id': 0}}]"

  collection_1 = "spark_1"
  collection_2 = "spark_2"
  output_collection = 'diff_uid'
  except_id(collection_1, collection_2, output_collection, pipeline)
  print('success')

完整代码地址: spark_count_diff_uid.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
Python程序设计入门(2)变量类型简介
Jun 16 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
Python编码类型转换方法详解
Jul 01 Python
python并发编程之线程实例解析
Dec 27 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
Python根据服务获取端口号的方法
Sep 25 Python
pytorch 自定义参数不更新方式
Jan 06 Python
python绘制动态曲线教程
Feb 24 Python
如何让python的运行速度得到提升
Jul 08 Python
pytorch 如何使用float64训练
May 24 Python
详解Appium+Python之生成html测试报告
Jan 04 #Python
python虚拟环境迁移方法
Jan 03 #Python
对django xadmin自定义菜单的实例详解
Jan 03 #Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 #Python
Python代码打开本地.mp4格式文件的方法
Jan 03 #Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 #Python
python scp 批量同步文件的实现方法
Jan 03 #Python
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
使用Python的内建模块collections的教程
2015/04/28 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Django xadmin安装及使用详解
2020/10/26 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
求职简历中个人的自我评价
2013/12/01 职场文书
护士检查书
2014/01/17 职场文书
岗位职责说明书
2014/05/07 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers
MySQL数据库 安全管理
2022/05/06 MySQL
Spring 使用注解开发
2022/05/20 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android