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之类的细节
Oct 13 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Django学习教程之静态文件的调用详解
May 08 Python
Python 移动光标位置的方法
Jan 20 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
python 读取修改pcap包的例子
Jul 23 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
Python如何使用字符打印照片
Jan 03 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
零基础学python应该从哪里入手
Aug 11 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 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 防恶意刷新实现代码
2010/05/16 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
详解Django中的过滤器
2015/07/16 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
主题班会演讲稿
2014/05/22 职场文书
远程培训的心得体会
2014/09/01 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
毕业生见习报告总结
2014/11/08 职场文书
总经理岗位职责
2015/02/04 职场文书
团委工作总结2015
2015/04/02 职场文书
检讨书格式范文
2015/05/07 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2015年教师国培感言
2015/08/01 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang