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 相关文章推荐
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
利用Python读取文件的四种不同方法比对
May 18 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
python DataFrame 取差集实例
Jan 30 Python
python 两个数据库postgresql对比
Oct 21 Python
python zip()函数使用方法解析
Oct 31 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Java多线程实现四种方式原理详解
Jun 02 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
Python字典的基础操作
Nov 01 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
use jscript List Installed Software
2007/06/11 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
Bootstrap精简教程
2015/11/27 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
基于vue.js无缝滚动效果
2018/01/25 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
python3 实现函数写文件路径的正确方法
2019/11/27 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
个人培训自我鉴定
2014/03/28 职场文书
关于安全的标语
2014/06/10 职场文书
工厂标语大全
2014/10/06 职场文书
撤诉申请怎么写
2015/05/19 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
学生会部长竞选稿
2015/11/19 职场文书
2016教师国培研修感言
2015/12/08 职场文书
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript