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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
Python的Tornado框架异步编程入门实例
Apr 24 Python
python学生信息管理系统
Mar 13 Python
python实现周期方波信号频谱图
Jul 21 Python
基于DataFrame改变列类型的方法
Jul 25 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
简单了解django文件下载方式
Feb 10 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
pytorch中index_select()的用法详解
Jan 06 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
多个PHP中文字符串截取函数
2013/11/12 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
纯js实现背景图片切换效果代码
2010/11/14 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python描述器descriptor详解
2015/02/03 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python下简易的单例模式详解
2019/04/08 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
python set集合使用方法解析
2019/11/05 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
我有一个梦想演讲稿
2014/05/05 职场文书
县委务虚会发言材料
2014/10/20 职场文书
毕业典礼邀请函
2015/01/31 职场文书
污水处理保证书
2015/05/09 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫