wordC.py
from __future__ import print_function
import sys
from operator import add
# SparkSession:是一個對Spark的編程入口,取代了原本的SQLContext與HiveContext,方便調用Dataset和DataFrame API
# SparkSession可用於創建DataFrame,將DataFrame註冊爲表,在表上執行SQL,緩存表和讀取parquet文件。
from pyspark.sql import SparkSession
if __name__ == "__main__":
# Python 常用的簡單參數傳入
if len(sys.argv) != 2:
print("Usage: wordcount <file>", file=sys.stderr)
sys.exit(-1)
# appName 爲 Spark 應用設定一個應用名,改名會顯示在 Spark Web UI 上
# 假如SparkSession 已經存在就取得已存在的SparkSession,否則創建一個新的。
spark = SparkSession \
.builder \
.appName("PythonWordCount") \
.getOrCreate()
# 讀取傳入的文件內容,並寫入一個新的RDD實例lines中,此條語句所做工作有些多,不適合初學者,可以截成兩條語句以便理解。
# map是一種轉換函數,將原來RDD的每個數據項通過map中的用戶自定義函數f映射轉變爲一個新的元素。原始RDD中的數據項與新RDD中的數據項是一一對應的關係。
lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
# flatMap與map類似,但每個元素輸入項都可以被映射到0個或多個的輸出項,最終將結果”扁平化“後輸出
counts = lines.flatMap(lambda x: x.split(' ')) \
.map(lambda x: (x, 1)) \
.reduceByKey(add)
# collect() 在驅動程序中將數據集的所有元素作爲數組返回。 這在返回足夠小的數據子集的過濾器或其他操作之後通常是有用的。由於collect 是將整個RDD匯聚到一臺機子上,所以通常需要預估返回數據集的大小以免溢出。
output = counts.collect()
for (word, count) in output:
print("%s: %i" % (word, count))
spark.stop()
再將下列文本拷貝到wordC.py平級目錄下
a.txt
These examples give a quick overview of the Spark API.
Spark is built on the concept of distributed datasets, which contain arbitrary Java or Python objects.
打開cmd,輸入如下命令,成功得到結果
參考:
【1】Apache開源軟件檔案
【2】初識Windows下Python開發Spark