使用物件清單建立 Avro 架構
1. 概述
Apache Avro 是一個資料序列化框架,提供強大的資料結構和輕量級、快速的二進位資料格式。
在本教程中,我們將探索如何建立 Avro 架構,該架構在轉換為物件時包含其他物件的清單。
2. 目標
假設我們想要發展一個表示父子關係的 Avro 模式。因此,我們需要一個包含Child
物件清單的Parent
類別。
這在 Java 程式碼中可能是這樣的:
public class Child {
String name;
}
public class Parent {
List<Child> children;
}
我們的目標是創建一個 Avro 模式,為我們將其結構轉換為這些物件。
在查看解決方案之前,讓我們快速回顧一下 Avro 的一些基礎知識:
- Avro 模式是使用 JSON 定義的
-
type
字段指的是資料類型(例如,record, array, string
) -
fields
數組定義記錄的結構
3. 建立 Avro 架構
為了正確說明 Avro 中的Parent-Child
關係,我們需要使用record
和array
類型的組合。
該架構如下圖所示:
{
"namespace": "com.baeldung.apache.avro.generated",
"type": "record",
"name": "Parent",
"fields": [
{
"name": "children",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "Child",
"fields": [
{"name": "name", "type": "string"}
]
}
}
}
]
}
我們先定義一個 Parent 類型的record
Parent.
在Parent
record,
我們定義了一個children
欄位。這個欄位是一個陣列type
,它可以讓我們儲存多個Child
物件。 array
類型的items
屬性詳細說明了陣列每個元素部分的結構。在我們的例子中,這是一個Child
記錄。正如我們所看到的, Child
記錄有一個字串類型的屬性name
string.
4. 在 Java 中使用 Schema
一旦定義了 Avro 模式,我們將使用它來產生 Java 類別。當然,我們將使用 Avro Maven 插件來完成此操作。這是parent
pom 檔案中的配置:
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.11.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>src/main/java/com/baeldung/apache/avro/schemas</sourceDirectory>
<outputDirectory>src/main/java</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
為了讓 Avro 產生我們的類,我們需要執行 Maven 產生來源命令(mvn clean generate-sources)
或前往 Maven 工具視窗的Plugins
部分並執行avro
插件的avro:schema
目標:
這樣,Avro 根據提供的模式在提供的namespace
中建立 Java 類別。 namespace
屬性還將包名稱添加到生成的類別的頂部。
5. 使用產生的類別
新建立的類別提供了設定方法,用於取得和設定children
清單。看起來是這樣的:
@Test
public void whenAvroSchemaWithListOfObjectsIsUsed_thenObjectsAreSuccessfullyCreatedAndSerialized() throws IOException {
Parent parent = new Parent();
List<Child> children = new ArrayList();
Child child1 = new Child();
child1.setName("Alice");
children.add(child1);
Child child2 = new Child();
child2.setName("Bob");
children.add(child2);
parent.setChildren(children);
SerializationDeserializationLogic.serializeParent(parent);
Parent deserializedParent = SerializationDeserializationLogic.deserializeParent();
assertEquals("Alice", deserializedParent.getChildren().get(0).getName());
}
從上面的測試我們看到我們已經創建了一個新的Parent.
我們可以這樣做,或使用可用的builder()
。這篇關於 Avro 預設值的文章說明如何使用builder()
模式。
然後,我們建立兩個Child
對象,並將其新增到Parent's
children
屬性中。最後,我們序列化和反序列化物件並比較其中一個名稱。
六、結論
在本文中,我們了解如何建立包含物件清單的 Avro 架構。此外,我們也詳細介紹如何使用Child
記錄的list
屬性定義Parent record
。這是我們在 Avro 中表示複雜資料結構的一種方式。此外,當我們需要處理物件集合或分層資料時,這特別有用。
最後,Avro 模式非常靈活,我們可以配置它們來設定更複雜的資料結構。我們可以組合不同的類型和巢狀結構來複製我們的資料模型。
與往常一樣,程式碼可以在 GitHub 上取得。