本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
在Spark中,我們提及的JSON文件是換行符分隔的JSON,每行必須包含一個單獨的,獨立有效的JSON對象。
前提條件
通過主賬號登錄阿里云 Databricks控制臺。
已創建集群,具體請參見創建集群。
已使用OSS管理控制臺創建非系統目錄存儲空間,詳情請參見創建存儲空間。
創建集群并通過knox賬號訪問Notebook。
首次使用DDI產品創建的Bucket為系統目錄Bucket,不建議存放數據,您需要再創建一個Bucket來讀寫數據。
BucketName為您的存儲空間名稱。
Object為上傳到OSS上的文件的訪問路徑。
例:讀取在存儲空間名稱為databricks-demo-hangzhou文件路徑為demo/The_Sorrows_of_Young_Werther.txt的文件
// 從oss地址讀取文本文檔
val dataRDD = sc.textFile("oss://databricks-demo-hangzhou/demo/The_Sorrows_of_Young_Werther.txt"
JSON讀取程序中的可選項
read/write | Key | 取值范圍 | 默認值 | 說明 |
Both | Compression或code | None,uncompressed,bzip2,defalte,gzip,lz4,snappy | none | 聲明Spark應該使用什么壓縮編解碼來讀取或寫入文件 |
Both | dateFormat | 任何符合Java SimpleDateFormat格式的字符串或字符 | yyyy-MM-dd | 為日期類型的列聲明日期格式 |
Both | timestampFormat | 任何符合Java SimpleDateFormat格式的字符串或字符 | yyyy-MM-dd'T'HH:mm:ss:SSSZZ | 為時間戳類型的列聲明時間格式 |
Read | primitiveAsString | true,false | false | 將所有原始值推斷為字符串類型 |
Read | allowComments | true,false | false | 忽略JSON記錄中的Java/C++樣式注解 |
Read | allowUnquoteFieldNames | true,false | false | 允許不帶引號的JSON字段名 |
Read | allowSingleQuotes | true,false | true | 除雙引號外還允許使用單引號 |
Read | allowNumericLeadingZeros | true,false | false | 允許數字中存在前導零(例如,00012) |
Read | allowBackslashEscAPIngAny | true,false | false | 允許反斜杠機制接受所有字符 |
Read | columnNameOfCorruptRecord | Any String | Spark.sql.column&NameOfCorruptRecord | 允許重命名,permissive模式下添加的新字段,會覆蓋重寫 |
Read | multiLine | true,false | false | 允許讀取非換行符分隔的JSON文件 |
實例
本實例展示了如何使用notebook讀取JSON文件的多種方式。
%spark
spark.read.format("json")
實例數據
{"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}}
{"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}}
{"string":"string3","int":3,"array":[3,6,9],"dict": {"key": "value3", "extra_key": "extra_value3"}}
數據讀取
%spark
val path="oss://databricks-data-source/datas/example.json"
val data_json=spark.read .format("json").load(path)
data_json.show()
data_json.printSchema()
2. 添加mode,inferSchema選項
mode = FAILFAST
inferSchema = true
%spark
val path="oss://databricks-data-source/datas/example.json"
val data_json= spark.read.format("json")
.option("header", "true")
.option("mode","FAILFAST")
.option("inferSchema","true")
.load(path)
data_json.show()
data_json.printSchema()
3. multiLine 選項
多個對象組成的一條JSON時的數據源
{"1":{"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}},
"2":{"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}},
"3":{"string":"string3","int":3,"array":[3,6,9],"dict": {"key": "value3", "extra_key": "extra_value3"}}}
實例代碼
%spark
val path="oss://databricks-data-source/datas/json_test_oneLine.json"
val data_json= spark.read.format("json")
.option("header", "true")
.option("inferSchema","true")
.option("mode", "DROPMALFORMED") //遇到解析不了,放棄該記錄
.option("multiLine", "true") //允許讀取非換行符分割的JSON文件
.load(path)
data_json.show(false)
SQL格式
%sql
CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="oss://databricks-data-source/datas/example.json")
%sql
select * from multiLineJsonTable limit 3