Hadoop支持的文件格式之Avro(上)

简介: Hadoop支持的文件格式之Avro(上)

0x00 文章内容


  1. 行存储与列存储
  2. 编码实现Avro格式的读写


0x01 行存储与列存储


比如现在有一张表,数据如下:

image.png


分别用行存储于列存储。

1. 行存储

a. 行存储的存储方式


image.png


传统数据库就是行存储,如MySQL等。

2. 列存储

a. 列存储的存储方式


image.png


其中,这里对行进行了一个split,两行为一个split。思想与HBase的Region分区类似。


HBase理论参考文章:浅显易懂入门大数据系列:四、HBase(超详细)的 五、HBase的存储结构

并且了解行存储与列存储的优缺点。

2. Avro与Parquet

a. Avro是行存储,Parquet是列存储。

b. 还需要清楚的是Avro与Parquet格式都是有Schema的,即结构。类似于我们传统数据库的字段,所以在写的时候需要指定。


0x02 编码实现Avro格式的读写


1. 编码实现读写Avro文件

a. 引入Avro相关jar包

    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>1.8.0</version>
    </dependency>


b. 引入Avro的Schema文件,编辑,放于src/main/data目录下,命名为:person.avsc


{"namespace": "com.shaonaiyi.hadoop.filetype.avro",
  "type": "record",
  "name": "Person",
  "fields": [
      {"name": "name", "type": "string"},
      {"name": "age",  "type": ["int", "null"]},
      {"name": "favorite_number",  "type": ["int", "null"]},
      {"name": "favorite_color", "type": ["string", "null"]}
  ]
 }


我们准备使用此定义好结构的文件生成一个对应的Java实体类,所以这里定义了实体类存放的位置,这里是:com.shaonaiyi.hadoop.filetype.avro


image.png


c. 我们准备使用Maven插件工具生成Java类,此处引入插件:

    <plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.7.7</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>schema</goal>
                </goals>
                <configuration>
                    <sourceDirectory>${project.basedir}/src/main/data</sourceDirectory>
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>


image.png


d. 生成Java类(clean->compile


image.png


执行完,会发现已经生成了一个Person类,可能会报错,我们将@Override注释掉即可,因为之前写过一些代码,所以报错了,不管它。


微信图片_20220618230054.png


e. Person类里面这行就是我们所需要的Schema,对应着我们的person.avsc

public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Person\",\"namespace\":\"com.shaonaiyi.hadoop.filetype.avro\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":[\"int\",\"null\"]},{\"name\":\"favorite_number\",\"type\":[\"int\",\"null\"]},{\"name\":\"favorite_color\",\"type\":[\"string\",\"null\"]}]}");



g. 完整的写Avro文件代码

package com.shaonaiyi.hadoop.filetype.avro;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumWriter;
import java.io.File;
import java.io.IOException;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/17 16:17
 * @Description 编码实现写Avro文件
 */
public class AvroFileWriter {
    public static void main(String[] args) throws IOException {
        GenericRecord record1 = new GenericData.Record(Person.SCHEMA$);
        record1.put("name", "shaonaiyi");
        record1.put("age", 18);
        record1.put("favorite_number", 7);
        record1.put("favorite_color", "red");
        GenericRecord record2 = new GenericData.Record(Person.SCHEMA$);
        record2.put("name", "shaonaier");
        record2.put("age", 17);
        record2.put("favorite_number", 1);
        record2.put("favorite_color", "yellow");
        File file = new File("person.avro");
        DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(Person.SCHEMA$);
        DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(writer);
        dataFileWriter.create(Person.SCHEMA$, file);
        dataFileWriter.append(record1);
        dataFileWriter.append(record2);
        dataFileWriter.close();
    }
}


h. 完整的读Avro文件代码

package com.shaonaiyi.hadoop.filetype.avro;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import java.io.File;
import java.io.IOException;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/17 16:48
 * @Description 编码实现读Avro文件
 */
public class AvroFileReader {
    public static void main(String[] args) throws IOException {
        File file = new File("person.avro");
        DatumReader<GenericRecord> reader = new GenericDatumReader<>();
        DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(file, reader);
        GenericRecord record = null;
        while (dataFileReader.hasNext()) {
            record = dataFileReader.next();
            System.out.println("name:" + record.get("name").toString());
            System.out.println("age:" + record.get("age").toString());
            System.out.println("favorite_number:" + record.get("favorite_number").toString());
            System.out.println("favorite_color:" + record.get("favorite_color"));
            System.out.println("-----------------------------------");
        }
    }
}
相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
分布式计算 大数据 Hadoop
【大数据开发技术】实验03-Hadoop读取文件
【大数据开发技术】实验03-Hadoop读取文件
213 0
|
3月前
|
存储 大数据 测试技术
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
在大数据环境中,数据存储格式直接影响查询性能和成本。本文探讨了 Parquet、Avro 和 ORC 三种格式在 Google Cloud Platform (GCP) 上的表现。Parquet 和 ORC 作为列式存储格式,在压缩和读取效率方面表现优异,尤其适合分析工作负载;Avro 则适用于需要快速写入和架构演化的场景。通过对不同查询类型(如 SELECT、过滤、聚合和联接)的基准测试,本文提供了在各种使用案例中选择最优存储格式的建议。研究结果显示,Parquet 和 ORC 在读取密集型任务中更高效,而 Avro 更适合写入密集型任务。正确选择存储格式有助于显著降低成本并提升查询性能。
499 1
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
|
2月前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
44 3
|
2月前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
41 2
|
2月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
38 1
|
2月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
51 1
|
5月前
|
分布式计算 Hadoop Java
Hadoop编辑hadoop-env.sh文件
【7月更文挑战第19天】
335 5
|
5月前
|
分布式计算 Hadoop Shell
Hadoop修改bashrc或profile文件
【7月更文挑战第16天】
164 2
|
5月前
|
分布式计算 Hadoop 关系型数据库
实时计算 Flink版操作报错合集之Hadoop在将文件写入HDFS时,无法在所有指定的数据节点上进行复制,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
存储 分布式计算 NoSQL

相关实验场景

更多