1. 程式人生 > 其它 >大資料開發之資料讀取—Pandas vs Spark

大資料開發之資料讀取—Pandas vs Spark

資料讀取是所有資料處理分析的第一步,而Pandas和Spark作為常用的計算框架,都對常用的資料來源讀取內建了相應介面。總體而言,大資料培訓資料讀取可分為從檔案讀取和從資料庫讀取兩大類,其中資料庫讀取包含了主流的資料庫,從檔案讀取又區分為不同的檔案型別。基於此,本文首先分別介紹Pandas和Spark常用的資料讀取API,而後進行簡要對比分析。

01 Pandas常用資料讀取方法

Pandas內建了豐富的資料讀取API,且都是形如pd.read_xxx格式,通過對pd頂級介面方法進行過濾,得到Pandas中支援的資料讀取API列表如下:

過濾pandas中以read開頭的方法名稱

按照個人使用頻率,對主要API介面介紹如下:

  • read_sql:用於從關係型資料庫中讀取資料,涵蓋了主流的常用資料庫支援,一般來講pd.read_sql的第一個引數是SQL查詢語句,第二個引數是資料庫連線驅動,所以從這個角度講read_sql相當於對各種資料庫讀取方法的二次包裝和整合;
  • read_csv:其使用頻率不亞於read_sql,而且有時考慮資料讀取效率問題甚至常常會首先將資料從資料庫中轉儲為csv檔案,而後再用read_csv獲取。這一轉儲的過程目的有二:一是提高讀取速度,二是降低資料讀取過程中的執行記憶體佔用(實測同樣的資料轉儲為csv檔案後再讀取,記憶體佔用會更低一些);
  • read_excel:其實也是對xlrd庫的二次封裝,用來讀取Excel檔案會更加方便,但日常使用不多;
  • read_json:json檔案本質上也屬於結構化資料,所以也可將其讀取為DataFrame型別,但如果巢狀層級差別較大的話,讀取起來不是很合適;
  • read_html:這應該算是Pandas提供的一個小彩蛋了,表面上看它就是一個用於讀取html檔案中資料表格的介面,但實際上有人卻拿他來幹著爬蟲的事情……
  • read_clipboard:這可以算是Pandas提供的另一個小彩蛋,用於從剪下板中讀取結構化資料到DataFrame中。至於資料是如何到剪下板中的,那方式可能就多種多樣了,比如從資料庫中複製、從excel或者csv檔案中複製,進而可以方便的用於讀取小型的結構化資料,而不用大費周章的連線資料庫或者找到檔案路徑!
  • read_table:可用於讀取txt檔案,使用頻率不高;
  • read_parquet:Parquet是大資料中的標誌性檔案,Pandas也對其予以支援,但依賴還是很複雜的;
  • 另外,還有ocr和pickle等檔案型別,其中OCR是Hive中的標準資料檔案型別,與Parquet類似,也是列式儲存,雖然Pandas也提供支援,但既然是大資料,其實與Pandas已經關係不大了;而pickle則是python中常用的序列化儲存格式。

在以上方法中,重點掌握和極為常用的資料讀取方法當屬read_sql和read_csv兩種,尤其是read_csv不僅效率高,而且支援非常豐富的引數設定,例如支援跳過指定行數(skip_rows)後讀取一定行數(nrows)的資料,就是這個小技巧使得曾經小記憶體的我也能得以處理大資料,著實欣喜!

02 Spark常用資料讀取方法

與Pandas類似,Spark也提供了豐富的資料讀取API,對於常用的資料讀取方法也都給予了非常好的支援。這裡以Scala Spark為例,通過tab鍵補全命令檢視常用的資料讀取方法如下:

通過spark-shell的tab鍵補全得到spark.read.的系列方法

可以明顯注意到Spark的資料讀取API與Pandas介面名稱的一個顯著區別是:Spark採用二級介面的方式,即首先呼叫read屬性獲取讀介面的類,然後再區分資料來源細分為各種型別;而Pandas則是直接提供了read_各資料型別的API。仍然按照使用頻率來分:

  • spark.read.parquet:前面已經提到,parquet是大資料中的標準檔案儲存格式,也是Apache的頂級專案,相較於OCR而言,Parquet更為流行和通用。Parquet的優勢也不少,包括內建了資料Schema、高效的壓縮儲存等;
  • spark.read.jdbc:通過jdbc提供了對讀取各主流資料庫的支援,由於其實際上也是一個類,所以相應的引數設定都要依託option方法來進行傳遞,最後通過執行load實現資料的讀取。但不得不說,spark內建的一些預設引數相較於Pandas而言合理性要差很多,例如fetchSize預設為10,這對於大資料讀取而言簡直是致命的打擊,誰用誰知道……
  • spark.read.csv:spark對於csv檔案也給予了很好的支援,但引數配置相較於Pandas而言則要遜色很多
  • spark.read.textFile:典型的txt檔案讀取方式,相信很多人的一個Spark專案word count大多是從讀取txt檔案開始的吧,不過對於個人而言好像也僅僅是在寫word count時才用到了read.textFile。
  • 其他也有read.json和read.orc等,但使用頻率不高。

如果說Pandas讀取資料庫是最為常用的方法,那麼Spark其實最為常用的當屬Parquet,畢竟Parquet檔案與Spark等同為Apache頂級專案,而且更具大資料特色,稱得上是大資料檔案儲存的業界規範!

03 小結

整體來看,Pandas和Spark在資料讀取方面都提供了豐富的介面,支援的資料來源型別也大體相當。但對引數支援和易用性方面,Pandas對資料庫和csv檔案相對更加友好,而Spark與Parquet檔案格式則更為搭配。雖然同為資料計算框架,但Pandas是單機計算模式,而Spark則是分散式計算,所以不同的資料量級也自然決定了資料來源的側重點不同,本無高下之分,只能說各有千秋。

原創作者:luanhz