Nira Amit created SPARK-19656:
---------------------------------

             Summary: Can't load custom type from avro file to RDD with 
newAPIHadoopFile
                 Key: SPARK-19656
                 URL: https://issues.apache.org/jira/browse/SPARK-19656
             Project: Spark
          Issue Type: Question
          Components: Java API
    Affects Versions: 2.0.2
            Reporter: Nira Amit


If I understand correctly, in scala it's possible to load custom objects from 
avro files to RDDs this way:
{code}
ctx.hadoopFile("/path/to/the/avro/file.avro",
  classOf[AvroInputFormat[MyClassInAvroFile]],
  classOf[AvroWrapper[MyClassInAvroFile]],
  classOf[NullWritable])
{code}
I'm not a scala developer, so I tried to "translate" this to java as best I 
could. I created classes that extend AvroKey and FileInputFormat:
{code}
public static class MyCustomAvroKey extends AvroKey<MyCustomClass>{};

public static class MyCustomAvroReader extends 
AvroRecordReaderBase<MyCustomAvroKey, NullWritable, MyCustomClass> {
// with my custom schema and all the required methods...
    }
public static class MyCustomInputFormat extends 
FileInputFormat<MyCustomAvroKey, NullWritable>{

        @Override
        public RecordReader<MyCustomAvroKey, NullWritable> 
createRecordReader(InputSplit inputSplit, TaskAttemptContext 
taskAttemptContext) throws IOException, InterruptedException {
            return new MyCustomAvroReader();
        }
    }
...
JavaPairRDD<MyCustomAvroKey, NullWritable> records =
                sc.newAPIHadoopFile("file:/path/to/datafile.avro",
                        MyCustomInputFormat.class, MyCustomAvroKey.class,
                        NullWritable.class,
                        sc.hadoopConfiguration());
MyCustomClass first = records.first()._1.datum();
System.out.println("Got a result, some custom field: " + 
first.getSomeCustomField());
{code}
This compiles fine, but using a debugger I can see that `first._1.datum()` 
actually returns a `GenericData$Record` in runtime, not a `MyCustomClass` 
instance.
And indeed, when the following line executes:
{code}
MyCustomClass first = records.first()._1.datum();
{code}
I get an exception:
{code}
java.lang.ClassCastException: org.apache.avro.generic.GenericData$Record cannot 
be cast to my.package.containing.MyCustomClass
{code}
Am I doing it wrong? Or is this not possible in Java?



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to