2016-01-14 5 views
1

У меня есть следующие классы:Spark: .saveAsTextFile потери унаследованное поле для объекта Java

public final class Derived extends AbstractBase implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private String fieldA 
     : 
} 

public abstract class AbstractBase { 

    protected List<String> sources = new ArrayList<String>(); 

    public final String toJsonString() { 
     return (new Gson()).toJson(this); 
    } 

    @Override 
    public final String toString() { 
     return toJsonString(); 
    } 

    : 
} 

Тогда в моей Спарк работы:

val myRDD: RDD[Derived] = input.map { 
    ... 
}.saveAsTextFile("myOutput") 

Json строка каждого Derived объекта в файле myOutput всегда отсутствует список sources. Однако, если я вручную переместить

protected List<String> sources = new ArrayList<String>(); 

от AbstractBase к Derived класса, все работает отлично.

Кто-нибудь знает, почему унаследованное поле отсутствует во время метода Spark - saveAsTextfile?

Спасибо!

+0

У вас есть репроектор? Я не думаю, что это проблема 'saveAsTextFile'. Вы можете использовать 'collect(). Foreach (println)', чтобы проверить, выводит ли он тот же результат. – zsxwing

ответ

1

При написании текстового файла RDD он не будет использовать сериализацию Java, а только вызовет toString на каждую запись. Смотрите пример:

case class A (i:Int,s:String) extends Serializable { override def toString = "po"} 
val r = sc.parallelize(Seq(A(1,"a"), A(2,"b"))) 
r.saveAsTextFile("/tmp/f2") 
// hadoop fs -cat /tmp/f2/part* will give "po","po" 
// same but no overriding toString 
case class B (i:Int,s:String) extends Serializable 
val r = sc.parallelize(Seq(A(1,"a"), A(2,"b"))) 
r.saveAsTextFile("/tmp/f2") 
// result B(1,a) B(2,b) 

Обратите внимание, что он будет использовать Java сериализацию, если вы используете saveAsObjectFile но этот формат не очень дружественный для программ, не ява и приходит со своими недостатками (это медленнее и занимает больше места, то Kryo, для пример)

 Смежные вопросы

  • Нет связанных вопросов^_^