gpt4 book ai didi

java - Apache AVRO 如何序列化(大型)数据结构

转载 作者:搜寻专家 更新时间:2023-11-01 02:30:49 25 4
gpt4 key购买 nike

我正在考虑在 hadoop 上使用 AVRO。但我关心大型数据结构的序列化以及如何向(数据)类添加方法。

示例(取自 http://blog.voidsearch.com/bigdata/apache-avro-in-practice/ )显示了 facebook 用户的模型。

{
"namespace": "test.avro",
"name": "FacebookUser",
"type": "record",
"fields": [
{"name": "name", "type": "string"},
...,
{"name": "friends", "type": "array", "items": "FacebookUser"}
]
}

avro 是否在此模型中序列化了 facebook 用户的完整社交图谱?

[也就是说,如果我想序列化一个用户,序列化是否包括它的所有 friend 和他们的 friend 等等?]

如果答案是肯定的,我宁愿存储 friend 的 ID 而不是引用,以便在需要时在我的应用程序中查找。在那种情况下,我希望能够添加一个返回实际 friend 而不是 ID 的方法。

如何包装/扩展生成的 AVRO java 类以添加方法?

(也添加返回例如 friend 数的方法)

最佳答案

关于第二个问题:如何包装/扩展生成的 AVRO java 类以添加方法?

您可以使用 AspectJ 将新方法注入(inject)现有/生成的类。 AspectJ 仅在编译时需要。方法如下所示。

将 Person 记录定义为 Avro IDL (person.avdl):

@namespace("net.tzolov.avro.extend")
protocol PersonProtocol {
record Person {
string firstName;
string lastName;
}
}

使用 maven 和 avro-maven-plugin从 AVDL 生成 java 源:

<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.6.3</version>
</dependency>
......
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.6.3</version>
<executions>
<execution>
<id>generate-avro-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>idl-protocol</goal>
</goals>
<configuration>
<sourceDirectory>src/main/resources/avro</sourceDirectory>
<outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

以上配置假定 person.avid 文件位于 src/main/resources/avro 中。源在 target/generated-sources/java 中生成。

Generated Person.java 有两个方法:getFirstName() 和 getLastName()。如果您想使用另一种方法扩展它:getCompleteName() = firstName + lastName 那么您可以使用以下方面注入(inject)此方法:

package net.tzolov.avro.extend;

import net.tzolov.avro.extend.Person;

public aspect PersonAspect {

public String Person.getCompleteName() {
return this.getFirstName() + " " + this.getLastName();
}
}

使用 aspectj-maven-plugin使用生成的代码编织这方面的 maven 插件

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
....
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.2</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.6.12</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>

结果:

@Test
public void testPersonCompleteName() throws Exception {

Person person = Person.newBuilder()
.setFirstName("John").setLastName("Atanasoff").build();

Assert.assertEquals("John Atanasoff", person.getCompleteName());
}

关于java - Apache AVRO 如何序列化(大型)数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com