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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
pymongo为mongodb数据库添加索引的方法
May 11 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
python ipset管理 增删白名单的方法
Jan 14 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
python模块如何查看
Jun 16 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
pandas进行数据输入和输出的方法详解
Mar 23 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列出一个目录下的所有文件的代码
2012/10/09 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
Python imread、newaxis用法详解
2019/11/04 Python
在python中修改.properties文件的操作
2020/04/08 Python
如何利用python读取micaps文件详解
2020/10/18 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
导师推荐信范文
2014/05/09 职场文书
旅游活动总结
2014/08/27 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
公司经营目标责任书
2015/01/29 职场文书
嘉宾邀请函
2015/01/31 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS