我將spark數據框保存爲parquet文件,並且數據幀具有從avro對象構建的行。同樣的確切代碼在這裏 - https://stackoverflow.com/a/41491999/2440775Spark Avro實現實地編寫數字字段中的空值
我面臨的挑戰是,我打算能夠在輸入數據中缺少整數字段時具有空值。 Avro的似乎允許通過使用聯合類型,但是當我不指定缺省值或指定的AVSC「空」的默認值,我得到這樣的錯誤:
Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:LONG pos:7 not set and has no default value
at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)
Or
Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:UNION pos:7 not set and has no default value
at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)
如果我寫的默認值「0」,它saveAsParquet效果不錯
我也試過改變avro規範有第一個「空」類型第一個元素以來的第一個類型。
"type": ["null","long"], "default": null
這將導致如下的異常:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
在Avro的模式變更的長,空的順序導致以下異常
產生的原因:org.apache.avro.AvroTypeException :長的非數字默認值:null