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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
python入门前的第一课 python怎样入门
Mar 06 Python
python实现机器学习之多元线性回归
Sep 06 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python json转字典字符方法实例解析
Apr 13 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
scrapy处理python爬虫调度详解
Nov 23 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 Python
PyTorch中的torch.cat简单介绍
Mar 17 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 cout<<的一点看法
2010/01/24 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
JavaScript中的类继承
2010/11/25 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python中随机函数random用法实例
2015/04/30 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
运动会入场词50字
2014/02/20 职场文书
员工生日活动方案
2014/08/24 职场文书
公司离职证明标准格式
2014/11/18 职场文书
无保留意见审计报告
2015/06/05 职场文书
培训简讯范文
2015/07/20 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python