代码生成在avro中意味着什么 - hadoop

时间:2015-05-16 15:26:27

标签: hadoop avro

如果这个问题很愚蠢,请感到遗憾。我发现很难得到它的真正含义。当我读到'Hadoop权威指南'时,它说avro的最大优点是Avro中的代码生成是可选的。 This link有一个avro序列化/反序列化程序,有/无代码生成。是否有人可以帮助我准确理解有/无代码生成的含义以及相同的真实背景。

1 个答案:

答案 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[]之间。前者更易于开发,但如果数据的类型和数量是动态的或未知的,则后者是必要的。