提问者:小点点

avro-hadoop中的代码生成是什么意思


如果这个问题很傻,请遗憾。我发现很难理解它的真正含义。当我阅读“Hadoop权威指南”时,它说avro的最大优势是代码生成在Avro中是可选的。这个链接有一个带/不带代码生成的avro序列化/反序列化程序。有人能帮助我准确理解带/不带代码生成的含义以及相同的真实上下文吗?


共1个答案

匿名用户

这不是一个愚蠢的问题——这实际上是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[]之间的区别。前者更容易开发,但如果数据的类型和数量是动态的或未知的,后者是必要的。