1) spark可以讀取很多種數據格式,spark.read.按tab鍵表示顯示:
scala>spark.read.
csv format jdbc json load option options orc parquet schema table text textFile
2) spark.read.format("json")方式讀取json文件
scala> spark.read.format("json").load("file:///opt/module/data/input/2.json")
res0: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> spark.read.format("json").load("file:///opt/module/data/input/2.json").show
+---+--------+
|age| name|
+---+--------+
| 20|zhangsan|
| 20| lisi|
| 20| wangwu|
+---+--------+
3)上面的方式等同於這種方式 直接spark.read.json
scala> spark.read.json("file:///opt/module/data/input/2.json")
res3: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> spark.read.json("file:///opt/module/data/input/2.json").show
+---+--------+
|age| name|
+---+--------+
| 20|zhangsan|
| 20| lisi|
| 20| wangwu|
+---+--------+
4)因為spark.read.load 默認獲取parquet格式文件,所以需要特別關注一下這個點。

2.1) spark 寫數據的方法最直接的常用方式是df一下,因為得有數據,之前啥也沒有,所以需要用df來保存
scala> val df = spark.read.json("file:///opt/module/data/input/2.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
2)使用df.write.save 加路徑就可以了。
scala> df.write.save("file:///opt/module/data/output/one")
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
3)這是可以進入/opt/module/data/output/one看一下保存的什么東西
[root@hadoop1 one]# ll
total 4
-rw-r--r-- 1 root root 598 Oct 9 03:01 part-00000-555473fa-02fd-4cda-b5f7-07eb40c4a889.snappy.parquet
-rw-r--r-- 1 root root 0 Oct 9 03:01 _SUCCESS
你會發現保存的就是默認parquet文件

4) 但是,默認parquet的格式不是我想要的,那我應該format一下格式,放在新的文件夾里面output/two即可,注意一旦還放one里面的話,他會提示你已經存在了的錯誤。
scala> df.write.format("json")save("file:///opt/module/data/output/two")
drwxr-xr-x 2 root root 168 Oct 9 03:09 two
[root@hadoop1 output]# cd two
[root@hadoop1 two]# ll
total 4
-rw-r--r-- 1 root root 81 Oct 9 03:09 part-00000-aea3fbd5-8ec7-46d2-90a5-4330ac35fa24.json
-rw-r--r-- 1 root root 0 Oct 9 03:09 _SUCCESS
[root@hadoop1 two]#

5)接着上面的為什么要系統在建一個文件夾,但是我們公司需要保存的文件放在一個類別就放一個夾子里面。這里就涉及到保存的模式mode問題了,你給他你個mode()參數就可以了。
scala> df.write.format("json").mode("append").save("file:///opt/module/data/output/two")
這里可以說是append追加方式,還有更多saveMode詳細介紹如下
scala/Java Any Language Meaning
SaveMode.ErrorIfExists(default默認方式) "error"(給報錯) 如果文件存在,則報錯
SaveMode.Append ““append” 下面追加
SaveMode.Overwrite "overwrite" 覆蓋寫入
SaveMode.Ignore "ignore" 數據存在,則忽略
我們如果重復操作append的話,結果是兩個。
[root@hadoop1 two]# ll
total 8
-rw-r--r-- 1 root root 81 Oct 9 03:29 part-00000-4a2c0712-ad48-4ca5-ae39-6eb0ee94bd42.json
-rw-r--r-- 1 root root 81 Oct 9 03:31 part-00000-f35ef5bf-e1e5-4262-893f-44a8d0ce9080.json
-rw-r--r-- 1 root root 0 Oct 9 03:31 _SUCCESS

