hadoop中代码生成意味着什么

c2e8gylq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(366)

如果这个问题很愚蠢,请原谅。当我读到《hadoop权威指南》时,它说avro的最大优点是代码生成在avro中是可选的。这个链接有一个用于avro序列化/反序列化的程序,可以生成代码,也可以不生成代码。有人能帮我准确地理解有/没有代码生成意味着什么,以及代码生成的真实上下文吗。

zpgglvta

zpgglvta1#

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

相关问题