問題
你正試圖讀取JSON文件。
你知道文件數據,但是Apache火花JSON返回一個讀者零價值。
示例代碼
您可以使用該示例代碼來重現該問題。
- 創建一個測試在DBFS JSON文件。
% python dbutils.fs.rm (“dbfs: / tmp / json / parse_test.txt”) dbutils.fs.put (“dbfs: / tmp / json / parse_test。txt”、“”“{”data_flow ":{“上遊”:[{" $ ":{“源”:“輸入”},“cloud_type”: "},{" $ ":{“源”:“文件”},“cloud_type”:{“蔚藍”:“雲平台”,“aws”:“雲服務”}}]}}”“”)Beplay体育安卓版本
- 讀取JSON文件。
% python jsontest = spark.read.option (“inferSchema”,“真正的”). json (“dbfs: / tmp / json / parse_test.txt”)顯示(jsontest)
- 結果是一個null值。
導致
- 在火花2.4及以下,JSON解析器允許空字符串。隻有特定的數據類型,如IntegerType被視為零空的時候。
- 在火花3.0及以上,JSON解析器不允許空字符串。所有數據類型是拋出一個異常,除了BinaryType和StringType。
有關更多信息,審查火花SQL遷移指南。
示例代碼
JSON的例子顯示了錯誤,因為有兩個相同的分類字段的數據。
第一個cloud_type入口是一個空字符串。第二個cloud_type輸入的數據。
“cloud_type”:“”“cloud_type”:{“蔚藍”:“雲平台”,“aws”Beplay体育安卓版本:“雲服務”}
由於JSON解析器不允許空字符串在火花3.0及以上,零值作為輸出返回。
解決方案
設置火花配置(AWS|Azure|GCP)值spark.sql.legacy.json.allowEmptyString.enabled來真正的。這配置引發3.0 JSON解析器允許空字符串。
你可以設置此配置集群級別或筆記本級別。
示例代碼
% python spark.conf.set (“spark.sql.legacy.json.allowEmptyString。啟用”,真的)jsontest1 = spark.read.option (“inferSchema”,“真正的”). json (“dbfs: / tmp / json / parse_test.txt”)顯示(jsontest1)