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

What does code generation mean in avro - hadoop

如果这个问题很愚蠢,请深表歉意。我发现很难真正理解 means.When 我读 'Hadoop the definitive guide' 它说 avro 的最大优势是代码生成在 Avro 中是可选的。 This link 有一个用于 avro serialization/deserialization with/without 代码生成的程序。有人可以帮助我准确理解 with/without 代码生成的含义及其真实上下文吗?

这不是一个愚蠢的问题——它实际上是 Avro 的一个非常重要的方面。

With 代码生成通常意味着 编译您的 Java 应用程序之前,您有可用的 Avro 架构。作为开发人员,您将使用 Avro 编译器为架构中的每条记录生成 class,然后在您的应用程序中使用这些 class。

在引用的link中,作者是这样做的:java -jar avro-tools-1.7.5.jar compile schema student.avsc,然后直接使用student_marks class。

在这种情况下,class student_marks 的每个实例都继承自 SpecificRecord,具有用于访问内部数据的自定义方法(例如 getStudentId() 以获取student_id 字段)。

没有代码生成通常意味着您的应用程序没有任何特定的必要模式(例如,它可以处理不同类型的数据)。

在这种情况下,没有生成 student class,但您仍然可以读取 Avro 容器中的 Avro 记录。您不会有 student 的实例,但会有 GenericRecord 的实例。不会有任何有用的方法,例如 getStudentId(),但您可以使用方法 get("student_marks")get(0).

通常,将特定记录与代码生成一起使用更易于阅读、更易于序列化和反序列化,但如果在编译时不知道要处理的记录的确切架构,则通用记录会提供更大的灵活性。

一种有用的思考方式是将一些数据存储在有用的手写 POJO 结构与 Object[] 之间的区别。前者更容易开发,但如果数据类型和数量是动态的或未知的,则后者是必需的。