如果这个问题很愚蠢,请感到遗憾。我发现很难得到它的真正含义。当我读到'Hadoop权威指南'时,它说avro的最大优点是Avro中的代码生成是可选的。 This link有一个avro序列化/反序列化程序,有/无代码生成。是否有人可以帮助我准确理解有/无代码生成的含义以及相同的真实背景。
答案 0 :(得分:4)
这不是一个愚蠢的问题 - 它实际上是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[]
之间。前者更易于开发,但如果数据的类型和数量是动态的或未知的,则后者是必要的。