代码生成在Avro中是什么意思-hadoop

Vig*_*h I 2 hadoop avro

如果这个问题很愚蠢,请感到遗憾。我发现很难理解它的真正含义。当我阅读《 Hadoop权威指南》时,它说avro的最大优点是代码生成在Avro中是可选的。该链接具有用于有/无代码生成的avro序列化/反序列化的程序。有人可以帮助我准确地理解有/无代码生成的含义以及相同含义的真实上下文。

Rya*_*aba 5

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