Spark處理Json格式資料(Python)

來源:互聯網
上載者:User

標籤:

前言 Spark能夠自動推斷出Json資料集的“資料模式”(Schema),並將它載入為一個SchemaRDD執行個體。這種“自動”的行為是通過下述兩種方法實現的: jsonFile:從一個檔案目錄中載入資料,這個目錄中的檔案的每一行均為一個JSON字串(如果JSON字串“跨行”,則可能導致解析錯誤); jsonRDD:從一個已經存在的RDD中載入資料,這個RDD中的每一個元素均為一個JSON字串; 這裡我們僅討論jsonFile的情境,jsonRDD處理方法類似。  典型樣本 JSON的資料模式是非常靈活的,我們例舉常見的幾種可能性進行討論。 (1)JSON檔案中的資料模式一致,每一行的資料均為JSON字串(非JSON數組) 假設資料模式包含三個屬性:id、name、birthdate,測試資料如下所示:  Python測試代碼如下:  在終端上執行可以看到有兩部分輸出:   可以看到資料模式一致的情況下,資料模式被正確推斷,資料被正確解析。 (2)JSON檔案中的資料模式一致,每一行的資料均為JSON數組字串 假設資料模式包含三個屬性:id、name、birthdate,測試資料如下所示:  Python測試代碼同上,在終端上執行可以看到有兩部分輸出:   可以看到資料資料模式被正確推斷,JSON數組中的“多個”對象資料被正確解析,解析結果共有三行。 (3)JSON檔案中的資料模式一致,但每一行資料以兩種形式出現:JSON字串(非數組)、JSON數組字串 假設資料模式包含三個屬性:id、name、birthdate,測試資料如下所示:  其中第一行為JSON數組字串,包含有兩個JSON對象;第二行為JSON字串,表示一個JSON對象。 Python測試代碼同上,在終端上執行可以看到有兩部分輸出:   可以看到資料行混搭的情況下(同時包含JSON字串(非數組)和JSON數組字串),資料資料模式被正確推斷,資料被正確解析。 (4)JSON檔案中的資料模式不一致 假設資料模式有以下兩種情況: 模式一:id、name、birthdate模式二:id、name、birthdate、weight 測試資料如下所示:  其中第一行資料為JSON數組字串,資料模式為模式一;第二行資料為JSON字串(非數組),資料模式為模式二。 Python測試代碼同上,在終端上執行可以看到有兩部分輸出:   可以看到資料模式被推斷為模式二,資料也是按照模式二被解析;模式二相對於模式一多出一個屬性“weight”,如果資料匹配模式一,則屬性“weigth”的值以“None”的形式出現。 資料模式不一致還有一種比較複雜的情況:模式交錯,如下: 模式一:id、name、birthdate、height模式二:id、name、birthdate、weight 測試資料如下所示:  Python測試代碼同上,在終端上執行可以看到有兩部分輸出:   可以看出資料模式被推斷為模式一與模式二的並集,缺失的屬性以“None”的形式出現。 結論:資料模式不一致時,推斷模式為多個資料模式的並集。 (5)JSON檔案中的資料模式不一致,且資料模式存在類型多樣以及嵌套的情況; 模式一:id、name、birthdate、msg、extras模式二:id、name、birthdate、weight 測試資料如下所示:  第一行是一個JSON數組字串,包含兩個JSON字串,每個JSON字串的屬性msg是一個JSON字串,屬性extras是一個JSON數組字串。 Python測試代碼同上,在終端上執行可以看到有兩部分輸出:   可以看出資料模式被推斷為模式一與模式二的並集,其中msg被解析為struct類型,extras被解析為array類型(元素類型為struct),缺失的屬性以“None”的形式出現。 如果我們需要處理的JSON資料的模式是不一致的(對象屬性不一致),我們在代碼邏輯中如何進行判斷呢?以(5)中的測試資料為例,屬性weight並不是出現在所有資料行中,為了避免運行時拋出異常,需要根據是否包含屬性weight作出不同的處理,這時就需要用到Python內建函數hasattr,如下:  代碼中函數handle的作用:如果對象row含有屬性weight,則返回對應的屬性值;否則返回“no value”。而判斷row是否含有屬性“weight”是使用函數hasattr實現的。 通過上述的幾個樣本我們可以發現Spark可以正確應對常見的JSON日誌格式,但我們在充分利用JSON特性的同時(日誌屬性靈活擴充、JSON處理方式統一),也應該考慮合理設計JSON日誌資料模式,避免資料模式不一致或資料模式複雜給資料分析帶來的不便。 jsonFile相當於是Spark提供給我們的便利工具,省去了我們自己解析JSON資料的麻煩,但也可能會出現工具失效的情況,大部分原因來自於資料格式不統一或不規範,此時我們就得自己解析JSON資料。 Python內建了一個操作JSON資料的庫“json”,我們會經常使用到兩個方法: dumps:用於JSON對象序列化,即JSON對象 —> JSON字串 loads:用於JSON字串還原序列化,即JSON字串 —> JSON對象 方法使用樣本如下所示:  解決了JSON資料的序列化與還原序列化的問題後,還需要考慮一個情況: 資料分析時多數需要處理的都是文本資料,我們將一行文本(字串)還原序列化為一個JSON對象後,我們如何判斷這個對象是一個普通JSON對象,還是一個JSON數組?特別是我們需要根據不同的資料類型進行不同的處理時,這種資料類型的判斷就不可避免。 此時我們就需要用到Python的內建函數:isinstance,如下所示:  在終端執行上述代碼,可得結果:  可以看出JSON數組對象的類型為“list”,而普通JSON對象的類型為“dict”。  總結 Spark在處理JSON資料時通常可以直接使用jsonFile,如果資料格式不統一、不規範或者我們需要更為靈活的資料處理方式時,則可以將文本資料以字串的形式按行讀入,然後使用Python JSON相關庫、內建函數自行解析JSON資料。     

Spark處理Json格式資料(Python)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.