如果这个问题很傻,请遗憾。我发现很难理解它的真正含义。当我阅读“Hadoop权威指南”时,它说avro的最大优势是代码生成在Avro中是可选的。这个链接有一个带/不带代码生成的avro序列化/反序列化程序。有人能帮助我准确理解带/不带代码生成的含义以及相同的真实上下文吗?
这不是一个愚蠢的问题——这实际上是Avro非常重要的一个方面。
代码生成通常意味着在编译Java应用程序之前,您有一个可用的Avro模式。作为开发人员,您将使用Avro编译器为模式中的每条记录生成一个类,并在应用程序中使用这些类。
在引用的链接中,作者这样做:java-jaravro-tools-1.7.5。jar编译schema学生. avsc
,然后直接使用student_marks
类。
在这种情况下,类student_marks
的每个实例都继承自SpecficRecords
,并具有访问内部数据的自定义方法(例如getStuentId()
以获取student_id
字段)。
没有代码生成通常意味着您的应用程序没有任何特定的必要模式(例如,它可以处理不同类型的数据)。
在这种情况下,没有生成学生
类,但您仍然可以读取Avro容器中的Avro记录。您不会有学生
的实例,而是GenericRecords
的实例。不会有任何有用的方法,如getStuentId()
,但您可以使用方法get("student_marks")
或get(0)
。
通常,在代码生成中使用特定记录更容易阅读、更容易序列化和反序列化,但是当您想要处理的记录的确切模式在编译时未知时,通用记录提供了更大的灵活性。
一个有用的思考方法是将一些数据存储在有用的手写POJO结构中与Object[]
之间的区别。前者更容易开发,但如果数据的类型和数量是动态的或未知的,后者是必要的。