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获得时间的实例说明
Mar 25 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
详解在Python中处理异常的教程
May 24 Python
深入理解python try异常处理机制
Jun 01 Python
利用Python爬取可用的代理IP
Aug 18 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
如何通过python计算圆周率PI
Nov 11 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加密解密的代码
2006/10/09 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP单例模式详细介绍
2015/07/01 PHP
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
二年级体育教学反思
2014/01/15 职场文书
毕业实习评语
2014/02/10 职场文书
初中班主任寄语
2014/04/04 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
任命书格式
2014/06/05 职场文书
大专毕业生求职信
2014/07/05 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
2014年商场工作总结
2014/11/22 职场文书
小学生安全保证书
2015/05/09 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
apache ftpserver搭建ftp服务器
2022/05/20 Servers