2014-01-09 6 views
4

나는 avro.SpecificRecord를 확장하는 두 가지 유형의 AvroRecord를 가지고 있습니다. Java에서 다른 클래스의 서브 클래스를 만드는 방법이 있습니까? 그 중 하나가 PersonRecord이고 하위 클래스가되고 싶습니다. EmployeeRecord입니다. avro 데이터로 일반 Java 클래스를 채우고 싶지 않은 이유는 내가 hadoop을 사용하고 있으며 가능하다면 avro 파일을 직접 사용하려고하기 때문입니다.Avro 레코드 서브 클래 싱?

분명히하기 위해 내가 관심있는 다형성입니다. EmployeeRecord를 PersonRecord 인수로 취하는 함수를 사용하고 싶습니다.

감사합니다.

답변

3

내가 아브로 스키마 정의 파일에서 Avro 레코드를 "하위 클래스로 만들려고"하는 것을 이해한다고 생각하지만 가능하지 않다고 생각합니다.

대신에 EmployeeRecordPersonRecord 회원이 중첩 된 다음이 다음에 직원 별 관련 정보가 있어야합니다. 예 :

{ 
    "type": "record", 
    "name": "PersonRecord", 
    "namespace": "com.yourapp", 
    "fields": [ 
    { 
     "name": "first", 
     "type": "string" 
    }, 
    { etc... } 
    ] 
} 


{ 
    "type": "record", 
    "name": "EmployeeRecord", 
    "namespace": "com.yourapp", 
    "fields": [ 
    { 
     "name": "PersonInfo", 
     "type": "PersonRecord" 
    }, 
    { 
     "name": "salary", 
     "type": "int" 
    }, 
    { etc... } 
    ] 
} 
+1

감사합니다. 실제로 스키마 자체에서 avro 레코드를 하위 클래스로 분류하는 것은 불가능 해 보입니다. 우리는 여전히 당신이 제안한 것과 함께 PersonRecord로서 EmployeeRecord를 사용할 수 없을 것입니다. 내가 원하는 다형성이야. 즉, employeeRecord 인수에 적용 할 수있는 함수 (personRecord)입니다. 내가 수동으로 생성 된 자바 클래스 (avro에서)에 인터페이스를 추가하고 결국 작동 - 이제는 유형 함수 (인터페이스)의 기능을 작성하고 avro 도구가이긴 이후 다른 개발자에게이 인터페이스를 추가하도록 상기시키기 위해 몇 가지 단위 테스트를 추가했습니다. '티. 그래도 더 나은 솔루션을 찾으려면 :) – grasshopper

+0

Avro Java API - 특히 Generic/SpecificData의 induce() 메소드를 사용하여 하위 클래스의 Avro 스키마를 만들 수 있습니다. 그러나 이렇게하면 편의성이 떨어질 것입니다 코드와 독립적으로 스키마를 유지 관리해야합니다. – jtravaglini

+0

또한 http://stackoverflow.com/questions/20864470/polymorphism-and-inheritance-in-avro-schemas를 확인하시기 바랍니다. – jtravaglini