spark2 sql讀取json檔案的格式要求
問題導讀
1.spark2 sql如何讀取json檔案?
2.spark2讀取json格式檔案有什麼要求?
3.spark2是如何處理對於帶有表名資訊的json檔案的?
spark有多個數據源,json是其中一種。那麼對於json格式的資料,spark在操作的過程中,可能會遇到哪些問題?
這裡首先我們需要對json格式的資料有一定的瞭解。
json資料有兩種格式:
1.物件表示
2.陣列表示
二者也有巢狀形式。
比如我們建立一個個人資訊的json。
[Plain Text] 純文字檢視 複製程式碼
?
0102030405060708091011 | { "people": [ { "name": "aboutyun", "age": "4" }, { "name": "baidu", "age": "5" } ] } |
上面是一個比較常見的json。資訊我們大致也能看出來:people表示的是表名,後面的內容為表的內容,包含了姓名和年齡。然而我們在使用spark讀取的時候卻遇到點小問題。上面內容儲存為檔案people.json,然後上傳到hdfs的跟路徑,進入spark-shell,讀取json檔案
[Scala] 純文字檢視 複製程式碼
?
1 | val peopleDF = spark.read.json( "/people.json" ) |
列印schema
[Bash shell] 純文字檢視 複製程式碼
?
1 | peopleDF.printSchema |
這時候我們看到people並不是表名,而age和name也非列明。我們通過
[Scala] 純文字檢視 複製程式碼
?
1 | peopleDF.show |
展示列名
也就是說我們如果帶有"people"格式的資訊,DataFrame就會被認為是列名。個人認為這是spark不太好的地方,應該可以改進。這裡也可以自動讀取為表名或則忽略,而不是預設為一個欄位名稱。
既然目前spark是這麼做,那麼我們該如何做,才能讓spark正確的讀取?
我們來嘗試下面格式的json檔案
[Plain Text] 純文字檢視 複製程式碼
?
01020304050607080910 | [ { "name": "aboutyun", "age": "4" }, { "name": "baidu", "age": "5" } ] |
操作是同樣的方式
[Scala] 純文字檢視
?
1 | val peopleDF = spark.read.json( "/people.json" ) |
[Bash shell] 純文字檢視 複製程式碼
?
1 | peopleDF.printSchema |
接著我們來列印資料
[Scala] 純文字檢視 複製程式碼
?
1 | peopleDF.show |
這時候我們看到它能正確的顯示資料了。
從上面我們看出spark對於json檔案,不是什麼格式都是可以的,需要做一定的修改,才能正確讀取,相信以後spark會有所改進。