大數據系列:PySpark學習筆記(一)

大數據系列:PySpark學習筆記(一)

介紹

在處理和使用大數據時, Apache Spark是使用最廣泛的框架之一,而 Python是用於數據分析,機器學習等的最廣泛使用的編程語言之一。那麼,為什麼不一起使用它們呢?這就是 Spark with Python(也稱為 PySpark)出現的地方。

由於Python有著豐富的庫集,當今大多數數據科學家和分析專家都在使用Python 。Spark是用Scala語言開發的,它與Java非常相似。它將程序代碼編譯為JVM的字節碼,以進行大數據處理。為了使用Python支持Spark,Apache Spark社區發佈了PySpark。兩個方面的優點結合在一起帶來工作效率的提升。 在這個文章中,我將討論以下內容:

  • Apache Spark簡介及其功能
  • 為什麼要使用Python?
  • 使用Python設置Spark(PySpark)
  • PySpark SparkContext和數據流
  • PySpark RDD用例

Apache Spark簡介

Apache Spark是由Apache Software Foundation開發的用於實時處理的開源集群計算框架。Spark提供了一個接口,用於使用隱式數據並行性容錯性對整個集群進行編程

以下是Apache Spark的一些功能,這些功能使其比其他框架更具優勢:

大數據系列:PySpark學習筆記(一)

  • 速度:它比傳統的大規模數據處理框架快100倍。
  • 強大的緩存:簡單的編程層提供了強大的緩存和磁盤持久性功能。
  • 部署: 可以通過Mesos,通過Yarn的Hadoop或Spark自己的集群管理器進行部署。
  • 實時: 實時計算和低延遲(由於內存計算)。
  • 多種語言:它是此框架的最重要功能之一,因為可以用Scala,Java,Python和R進行編程。

為什麼要使用Python?

儘管Spark是在scala中設計的,這使其速度比Python快10倍,但是Scala僅在使用的內核數較少時才更快。由於當今大多數分析和過程都需要大量內核,因此Scala的性能優勢並不那麼多。

對於程序員而言由於其語法和標準庫,Python 相對容易 學習。而且,它是一種動態類型化的語言,這意味著RDD可以容納多種類型的對象。

儘管Scala具有SparkMLlib,但是它沒有足夠的庫和工具來滿足機器學習和NLP的目的。而且,Scala缺乏數據可視化。

使用Python設置Spark(PySpark)

假定您已經知道如何下載spark並安裝它。因此,一旦您解壓縮了spark文件,安裝並添加到.bashrc文件的路徑,則需要輸入source .bashrc

要打開pyspark shell,您需要輸入以下命令 ./bin/pyspark

大數據系列:PySpark學習筆記(一)

PySpark SparkContext和數據流

Py4j庫使用Python與Spark交互來使用RDD。PySpark Shell將Python API鏈接到spark核心並初始化Spark Context。Spark上下文是任何Spark 應用程序的核心。

  1. Spark上下文設置內部服務並建立與Spark執行環境的連接。
  2. 驅動程序中的sparkcontext對象協調所有分佈式過程並允許資源分配。
  3. 集群管理器提供執行器,它們是具有邏輯的JVM進程。
  4. SparkContext對象將應用程序發送給執行者。
  5. SparkContext在每個執行程序中執行任務。
大數據系列:PySpark學習筆記(一)

PySpark RDD用例

現在,讓我們看一下RDD

的用例。在這裡,我們使用一個數據集examples.csv作為範例

創建RDD:

現在我們可以使用該文件來創建RDD

data_file = "./data/examples.csv"
raw_data = sc.textFile(data_file)

過濾(filter):

假設我們要計算多少正常。我們在數據集中的互動。我們可以如下過濾 raw_data RDD。

計數(count):

現在,我們可以統計有多少元素在新RDD。

normal_raw_data.count()

輸出:

map:

在這種情況下,我們希望以CSV格式讀取數據文件。我們可以通過對RDD中的每個元素應用lambda函數來做到這一點,如下所示。在這裡,我們將使用

map()和take()轉換。

split_file = normal_raw_data.map(lambda line: line.split(","))

輸出:

[[u'10', u'上海', u'17', u'A2', u'M'],
[u'11', u'上海', u'14', u'B2', u'M']]

collect:

在這裡,我們將使用collect()動作。它將把RDD的所有元素都存儲到內存中。因此,在處理大型RDD時必須謹慎使用。

split_file.collect()

輸出:

[[u'10', u'上海', u'17', u'A2', u'M'],
[u'11', u'上海', u'14', u'B2', u'M']]

當然,這花費的時間比我們之前使用的任何其他操作更長。每個具有RDD片段的Spark工作者節點都必須進行協調,以便檢索其組成部分,然後一起縮減所有內容。

如果發現任何不正確的地方,或者想分享有關上述主題的更多信息,歡迎反饋。


分享到:


相關文章: