如果这个问题很愚蠢,请原谅。当我读到《hadoop权威指南》时,它说avro的最大优点是代码生成在avro中是可选的。这个链接有一个用于avro序列化/反序列化的程序,可以生成代码,也可以不生成代码。有人能帮我准确地理解有/没有代码生成意味着什么,以及代码生成的真实上下文吗。
zpgglvta1#
这不是一个愚蠢的问题——这实际上是avro的一个非常重要的方面。代码生成通常意味着在编译java应用程序之前,您有一个可用的avro模式。作为开发人员,您将使用avro编译器为模式中的每个记录生成一个类,并在应用程序中使用这些类。在引用的链接中,作者执行以下操作: java -jar avro-tools-1.7.5.jar compile schema student.avsc ,然后使用 student_marks 直接上课。在本例中,类的每个示例 student_marks 继承自 SpecificRecord ,具有用于访问内部数据的自定义方法(例如 getStudentId() 去拿 student_id 字段)。没有代码生成通常意味着应用程序没有任何特定的必要模式(例如,它可以处理不同类型的数据)。在这种情况下,没有 student 类生成,但仍可以读取avro容器中的avro记录。你不会有 student ,但是 GenericRecord . 不会有像这样有用的方法 getStudentId() ,但您可以使用 get("student_marks") 或者 get(0) .通常,在代码生成中使用特定记录更容易读取、更容易序列化和反序列化,但是当编译时不知道要处理的记录的确切模式时,泛型记录提供了更大的灵活性。一个有用的方法是将一些数据存储在一个有用的手写pojo结构和一个 Object[] . 前者更易于开发,但如果数据的类型和数量是动态的或未知的,则后者是必需的。
java -jar avro-tools-1.7.5.jar compile schema student.avsc
student_marks
SpecificRecord
getStudentId()
student_id
student
GenericRecord
get("student_marks")
get(0)
Object[]
1条答案
按热度按时间zpgglvta1#
这不是一个愚蠢的问题——这实际上是avro的一个非常重要的方面。
代码生成通常意味着在编译java应用程序之前,您有一个可用的avro模式。作为开发人员,您将使用avro编译器为模式中的每个记录生成一个类,并在应用程序中使用这些类。
在引用的链接中,作者执行以下操作:
java -jar avro-tools-1.7.5.jar compile schema student.avsc
,然后使用student_marks
直接上课。在本例中,类的每个示例
student_marks
继承自SpecificRecord
,具有用于访问内部数据的自定义方法(例如getStudentId()
去拿student_id
字段)。没有代码生成通常意味着应用程序没有任何特定的必要模式(例如,它可以处理不同类型的数据)。
在这种情况下,没有
student
类生成,但仍可以读取avro容器中的avro记录。你不会有student
,但是GenericRecord
. 不会有像这样有用的方法getStudentId()
,但您可以使用get("student_marks")
或者get(0)
.通常,在代码生成中使用特定记录更容易读取、更容易序列化和反序列化,但是当编译时不知道要处理的记录的确切模式时,泛型记录提供了更大的灵活性。
一个有用的方法是将一些数据存储在一个有用的手写pojo结构和一个
Object[]
. 前者更易于开发,但如果数据的类型和数量是动态的或未知的,则后者是必需的。