通常用spark讀取json檔案的時候,用的是
spark.read.json(path)
這種方式進行讀取,但是,當json檔案某一行有損壞的情況下,則會出現解析失敗,導致schema解析錯誤的情況,可能會遇到這種錯誤
found duplicate column(s) in the data schema
spark.read.option("mode","dropmalformed")
但是在我的資料下並沒有用。
然後我想出2個解決方案。
第乙個是用fastjson,來逐行解析,丟掉解析失敗的行。
第二個是用spark中指定schema的方式來解析。
最終我採取了第二種方式。
具體如下,我只將**重要部分提取,其他業務部分省略:
import org.apache.spark.sql.types._
val schema_1 = structtype(
list(
structfield("field_a", longtype),
structfield("field_b", longtype),
structfield("field_c", longtype),
structfield("field_d", arraytype(stringtype))))
val schema_2 = structtype(
list(
structfield("field_e", longtype),
structfield("field_f", longtype),
structfield("field_g", longtype),
structfield("field_h", arraytype(stringtype))))
val schema = structtype(
list(
structfield("schema_1", schema_1),
structfield("schema_2", schema_2)))
val df = spark.read.schema(schema).json(path)
這種方式有優點,也有缺點:
優點是,若不加schema,則spark.read.json方式則需要掃2遍所有json檔案,第一遍掃schema,第二遍解析。加入schema,則只需要掃一遍,第一遍掃schema跳過。
缺點是,增加了維護成本,若加入了一些字段,則這裡則需要同步修改。
如有遇到同樣問題的朋友們,有新的解決方案,歡迎交流。
c 解析json字串處理
完整 在文末,引用庫檔案後可直接執行 需求 假設有如下json字串 manager 請利用c 處理這個字串,在控制台顯示出公司的id,第一位員工的姓,和所有管理者的工資。解決步驟 為了更清晰的說明,本例在控制台中測試,本人程式設計環境vs2015 2 在vs中新建專案 控制台應用程式。4 在主程式p...
c 解析json字串處理
自 為了防止帖子丟失所以我又複製了一下 需求 假設有如下json字串 manager 請利用c 處理這個字串,在控制台顯示出公司的id,第一位員工的姓,和所有管理者的工資。解決步驟 為了更清晰的說明,本例在控制台中測試,本人程式設計環境vs2015 2 在vs中新建專案 控制台應用程式。4 在主程式...
Oracle回滾段表空間檔案丟損地處理
資料庫是啟動著的 如果你檢測到丟失或損壞了回滾段表空間的資料檔案,並且資料庫是執行著的,不要把它 down 掉。在很多情況下,資料庫是啟著的比關閉著解決問題更容易些。這種情況的兩種可能的解決方法 a 使丟失的那個資料檔案 offline,並從備份中恢復它,這種情況適用於資料庫是處於歸檔方式的。b 另...