【发布时间】:2017-01-05 18:41:30
【问题描述】:
我将 spark 数据框保存为 parquet 文件,并且该数据框具有从 avro 对象构建的行。相同的确切代码在这里 - https://stackoverflow.com/a/41491999/2440775
我面临的挑战是,当传入数据中缺少整数字段时,我打算能够有空值。 Avro 似乎允许通过使用联合类型来实现这一点,但是当我没有在 avsc 中指定默认值或指定默认值“null”时,我会收到如下错误:
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 规范更改为首先使用“null”类型,因为联合选择了第一个元素的类型。
"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 架构中更改 long 和 null 的顺序会导致以下异常
原因:org.apache.avro.AvroTypeException:long 的非数字默认值:null
【问题讨论】:
标签: apache-kafka apache-spark-sql avro parquet