1. 程式人生 > >spark2 sql讀取json檔案的格式要求

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] 純文字檢視 複製程式碼

?

1val peopleDF=spark.read.json("/people.json")


列印schema

[Bash shell] 純文字檢視 複製程式碼

?

1peopleDF.printSchema


0?wx_fmt=jpeg 

這時候我們看到people並不是表名,而age和name也非列明。我們通過


[Scala] 純文字檢視 複製程式碼

?

1peopleDF.show

展示列名
0?wx_fmt=jpeg 

也就是說我們如果帶有"people"格式的資訊,DataFrame就會被認為是列名。個人認為這是spark不太好的地方,應該可以改進。這裡也可以自動讀取為表名或則忽略,而不是預設為一個欄位名稱。

既然目前spark是這麼做,那麼我們該如何做,才能讓spark正確的讀取?
我們來嘗試下面格式的json檔案

[Plain Text] 純文字檢視 複製程式碼

?

01020304050607080910[{"name": "aboutyun","age": "4"},{"name": "baidu","age": "5"}]


操作是同樣的方式

[Scala] 純文字檢視

 複製程式碼

?

1val peopleDF=spark.read.json("/people.json")

[Bash shell] 純文字檢視 複製程式碼

?

1peopleDF.printSchema


0?wx_fmt=jpeg 

接著我們來列印資料

[Scala] 純文字檢視 複製程式碼

?

1peopleDF.show


0?wx_fmt=jpeg 

這時候我們看到它能正確的顯示資料了。
從上面我們看出spark對於json檔案,不是什麼格式都是可以的,需要做一定的修改,才能正確讀取,相信以後spark會有所改進。