如何導(dǎo)入數(shù)據(jù)
數(shù)據(jù)可能有各種格式,雖然常見的是HDFS,但是因?yàn)樵赑ython爬蟲中數(shù)據(jù)庫用的比較多的是MongoDB,所以這里會(huì)重點(diǎn)說說如何用spark導(dǎo)入MongoDB中的數(shù)據(jù)。
當(dāng)然,首先你需要在自己電腦上安裝spark環(huán)境,簡單說下,在這里下載spark,同時(shí)需要配置好JAVA,Scala環(huán)境。
這里建議使用Jupyter notebook,會(huì)比較方便,在環(huán)境變量中這樣設(shè)置
PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS=notebook ./bin/pyspark
如果你的環(huán)境中有多個(gè)Python版本,同樣可以制定你想要使用的解釋器,我這里是python36,根據(jù)需求修改。
PYSPARK_PYTHON=/usr/bin/python36
pyspark對(duì)mongo數(shù)據(jù)庫的基本操作 (๑• . •๑)

有幾點(diǎn)需要注意的:
不要安裝最新的pyspark版本,請(qǐng)安裝pip3 install pyspark==2.3.2 spark-connector 與平常的MongoDB寫法不同,格式是: mongodb://127.0.0.1:database.collection 如果計(jì)算數(shù)據(jù)量比較大,你的電腦可能會(huì)比較卡,^_^#!/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請(qǐng)看https://docs.mongodb.com/spark-connector/master/python-api/"""import osfrom pyspark.sql import SparkSession# set PYSPARK_PYTHON to python36os.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"# 創(chuàng)建spark,默認(rèn)使用本地環(huán)境,或者"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): """ 計(jì)算表1與表2中不同的數(shù)據(jù) :param collection_1: 導(dǎo)入表1 :param collection_2: 導(dǎo)入表2 :param output_collection: 保存的表 :param pipeline: MongoDB查詢語句 str :return: """ # 可以在這里指定想要導(dǎo)入的數(shù)據(jù)庫,將會(huì)覆蓋上面配置中的input_uri。下面保存數(shù)據(jù)也一樣 # .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,同理可以計(jì)算df_2有,df_1沒有 df = df_1.subtract(df_2) df.show() # mode 參數(shù)可選范圍 # * `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查詢語句,可以減少導(dǎo)入數(shù)據(jù)量 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')
新聞熱點(diǎn)
疑難解答
圖片精選