如何導入數據
數據可能有各種格式,雖然常見的是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
啓動命令
進入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
,分別是input
和output
,對應讀取的數據庫和寫入的數據庫,最後面的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
還可以定義database
和collection
,這樣就不需要在啓動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')
,否則會報錯。