Spark教程(二)Spark連接MongoDB

如何導入數據

數據可能有各種格式,雖然常見的是HDFS,但是因爲在Python爬蟲中數據庫用的比較多的是MongoDB,所以這裏會重點說說如何用spark導入MongoDB中的數據。

當然,首先你需要在自己電腦上安裝spark環境,簡單說下,在這裏下載spark,同時需要配置好JAVAScala環境。

這裏建議使用Jupyter notebook,會比較方便,在環境變量中這樣設置

PYSPARK_DRIVER_PYTHON=jupyter 
PYSPARK_DRIVER_PYTHON_OPTS=notebook ./bin/pyspark

如果你的環境中有多個Python版本,同樣可以制定你想要使用的解釋器,我這裏是python36,根據需求修改。

PYSPARK_PYTHON=/usr/bin/python36

啓動命令

進入spark根目錄,./bin/pyspark這是最簡單的啓動命令,默認會打開Python的交互式解釋器,但是由於我們上面有設置過,會打開Jupyter notebook,接下來變成會方便很多。

先來看看最簡單的例子:

>>> textFile = spark.read.text("README.md")

>>> textFile.count()  # Number of rows in this DataFrame126

>>> textFile.first()  # First row in this DataFrameRow(value=u'# Apache Spark')

>>> linesWithSpark = textFile.filter(textFile.value.contains("Spark"))


>>> textFile.filter(textFile.value.contains("Spark")).count()  # How many lines contain "Spark"?15

這裏有我之前寫過的例子,可以照着寫一遍 basic_exercise

我們的啓動方式是./bin/pyspark,我們可以家後面加很多參數,比如說如若我們要連接MongoDB,就需要這樣

完整的可以參考Spark Connector Python Guide

./bin/pyspark --conf "spark.mongodb.input.uri=mongodb://127.0.0.1/test.myCollection?readPreference=primaryPreferred" \
              --conf "spark.mongodb.output.uri=mongodb://127.0.0.1/test.myCollection" \
              --packages org.mongodb.spark:mongo-spark-connector_2.11:2.3.0

這裏有兩個uri,分別是inputoutput,對應讀取的數據庫和寫入的數據庫,最後面的packages相當於引入的包的名字,我一般喜歡在代碼中定義。

讀取/保存數據

這裏我們可以增加參數option,在這裏設置想要讀取的數據庫地址,注意格式。

讀取數據

df = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri","mongodb://127.0.0.1/people.contacts").load()

保存數據

people.write.format("com.mongodb.spark.sql.DefaultSource").mode("append").option("uri","mongodb://127.0.0.1/people.contacts").option("database","people").option("collection", "contacts").save()

簡單對比下,option還可以定義databasecollection,這樣就不需要在啓動Spark時定義。

以上是官網推薦的連接方式,這裏需要說的是另一種,如果我沒有從命令行中啓動,而是直接新建一個py文件,該如何操作?

搜索相關資料後,發現是這樣

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'zhangslob'

import os
from pyspark.sql import SparkSession

# set PYSPARK_PYTHON to python36
os.environ['PYSPARK_PYTHON'] = '/usr/bin/python36'

# load mongo data
input_uri = "mongodb://127.0.0.1:spark.spark_test"
output_uri = "mongodb://127.0.0.1:spark.spark_test"

my_spark = SparkSession\
    .builder\
    .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()

df = my_spark.read.format('com.mongodb.spark.sql.DefaultSource').load()

必須要增加默認設置('spark.jars.packages','org.mongodb.spark:mongo-spark-connector_2.11:2.2.0'),否則會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章