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中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
一行python实现树形结构的方法
Aug 09 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
python打印异常信息的两种实现方式
Dec 24 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
浅谈对python中if、elif、else的误解
Aug 20 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
PHP多例模式介绍
2013/06/24 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP中“=>
2019/03/01 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
three.js实现圆柱体
2018/12/30 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
简单谈谈Python中函数的可变参数
2016/09/02 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Django开发中的日志输出的方法
2018/07/02 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
公司JAVA开发面试题
2015/04/02 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
办公室主任先进事迹
2014/01/18 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
2016年党建工作简报
2015/11/26 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL