Avro是hadoop的一个用于序列化的组件
理解特点:
- 高效
- 序列化后体积小
- 动态 动态指的是数据的结构一旦定义,可以在多处语言生成实体类
引用jar包
<properties>
<maven.compiler.source>8</maven.compiler.source>
<avro.version>1.10.2</avro.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>${avro.version}</version>
</dependency>
</dependencies>
引用maven插件(如不生成代码可不必引用)
<!-- avro-maven-plugin -->
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>${avro.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/resources/avro/</sourceDirectory>
<outputDirectory>${project.build.directory}/generated/avro</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
插件中需要配置
- sourceDirectory: avro文件的目录,此处的avro文件也就是定义好的数据结构
- outputDirectory: 插件生成的实体存放的目录
1.快速使用
package com.zy.learn;
import com.zy.learn.avro.User;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import java.io.File;
import java.io.IOException;
/**
* @Author: Zy
* @Date: 2021/10/26 9:30
* avro测试类
*/
public class AvroTest {
/**
* 测试序列化
*
* @author Zy
* @date 2021/10/26
*/
public static void testSerializing() throws IOException {
User user1 = User.newBuilder()
.setName("zy")
.setFavoriteNumber(10)
.setFavoriteColor("hhh")
.build();
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(user1.getSchema(), new File("users.avro"));
dataFileWriter.append(user1);
dataFileWriter.close();
}
/**
* 反序列化
* @author Zy
* @date 2021/10/28
*/
public static void testDeserializing() throws IOException {
GenericDatumReader<GenericRecord> userDatumReader = new GenericDatumReader<>();
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("users.avro"), userDatumReader);
GenericRecord user = null;
while (dataFileReader.hasNext()) {
user = dataFileReader.next(user);
System.out.println(user);
}
}
public static void main(String[] args) throws IOException {
// testSerializing();
testDeserializing();
}
}
说明:
avro序列化如果使用代码生成,生成了实体后就直接使用实体作为泛型序列化和反序列化即可 类似上文例子中的测试序列化中的写法
如果没有使用代码生成,则没有实体类,此时avro提供了一个公共的类可以作为泛型,GenericRecord