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 相关文章推荐
12步教你理解Python装饰器
Feb 25 Python
简述Python2与Python3的不同点
Jan 21 Python
Python切片操作深入详解
Jul 27 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
django 消息框架 message使用详解
Jul 22 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
python3读取autocad图形文件.py实例
Jun 05 Python
如何在Windows中安装多个python解释器
Jun 16 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
python定义类的简单用法
Jul 24 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
[原创]图片分页查看
2006/08/28 Javascript
不错的一个日期输入 动态
2006/11/06 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
深入浅析Python的类
2018/06/22 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python re模块常见用法例举
2021/03/01 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
大学生军训自我鉴定
2014/02/12 职场文书
四年级评语大全
2014/04/21 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
教师继续教育反思周记
2015/06/25 职场文书
党员转正大会主持词
2015/07/02 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
mysql部分操作
2021/04/05 MySQL
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
Python实现归一化算法详情
2022/03/18 Python