`

Hadoop_Avro数据类型与模式

阅读更多
1.Avro基本数据类型
类型 描述   模式示例
null          The absence of a value      "null"
boolean    A binary value       "boolean"
int    32位带符号整数         "int"
long    64位带符号整数           "long"
float    32位单精度浮点数         "float"
double    64位双精度浮点数         "double"
bytes    byte数组(8位无字符字节序列)     "bytes"
string    Unicode字符串       "string"
【Avro基本数据类型还可以使用更冗长的形式使用type属性来指定如{"type":"null"}】
2.Avro复杂数据类型
数据类型 类型描述 模式示例
array        An ordered collection of objects.                 {              
             All objects in a particular                       "type": "array",
            array must have the same schema.                  "items": "long"
                                                                } 
                                                               
                                                                            
map        An unordered collection of key-value pairs.         {                                 
           Keys must be strings and values may be any type,       "type": "map",    
           although within a particular map,                      "values": "string"
           all values must have the same schema.                  }
          
                                                                                       
record A collection of named fields of any type. {                                      
                                                                "type": "record",                      
                                                                "name": "WeatherRecord",               
                                                                "doc": "A weather reading.",           
                                                                "fields": [                            
                                                                {"name": "year", "type": "int"},       
                                                                {"name": "temperature", "type": "int"},
                                                                {"name": "stationId", "type": "string"}
                                                                ]                                      
                                                                }                                      


enum A set of named values. {                                     
                                                                "type": "enum",                       
                                                                "name": "Cutlery",                    
                                                                "doc": "An eating utensil.",          
                                                                "symbols": ["KNIFE", "FORK", "SPOON"] 
                                                                }                                     
                                                                fixed                                 
                                                                A fixed number of 8-bit unsigned bytes.
                                                                {                                     
                                                                "type": "fixed",                      
                                                                "name": "Md5Hash",                    
                                                                "size": 16                            
                                                                }                                     


union A union of schemas. A union is represented by a JSON [                                  
            array, where each element in the array is a schema.       "null",                            
             Data represented by a union must match                   "string",                          
one of the schemas in the union.                        {"type": "map", "values": "string"}
                                                                      ] 

通过上图所示,通过程序可以将本地的小文件进行打包,组装成一个大文件在HDFS中进行保存,本地的小文件成为Avro的记录。具体的程序如下面的代码所示:
//对Avro数据文件的写入
public class AVRO_WRITE { 
    public static final String FIELD_CONTENTS = "contents"; 
    public static final String FIELD_FILENAME = "filename"; 
    public static final String SCHEMA_JSON = "{\"type\": \"record\",\"name\": \"SmallFilesTest\", " 
            + "\"fields\": [" 
            + "{\"name\":\"" 
            + FIELD_FILENAME 
            + "\",\"type\":\"string\"}," 
            + "{\"name\":\"" 
            + FIELD_CONTENTS 
            + "\", \"type\":\"bytes\"}]}"; 
    public static final Schema SCHEMA = new Schema.Parser().parse(SCHEMA_JSON); 
 
    public static void writeToAvro(File srcPath, OutputStream outputStream) throws IOException { 
        DataFileWriter<Object> writer = new  DataFileWriter<Object>(new GenericDatumWriter<Object>()).setSyncInterval(100); 
        writer.setCodec(CodecFactory.snappyCodec()); 
        writer.create(SCHEMA, outputStream); 
        for (Object obj : FileUtils.listFiles(srcPath, null, false)){ 
            File file = (File) obj; 
            String filename = file.getAbsolutePath(); 
            byte content[] = FileUtils.readFileToByteArray(file); 
            GenericRecord record = new GenericData.Record(SCHEMA); 
            record.put(FIELD_FILENAME, filename); 
            record.put(FIELD_CONTENTS, ByteBuffer.wrap(content)); 
            writer.append(record); 
            System.out.println(file.getAbsolutePath() + ":"+ DigestUtils.md5Hex(content)); 
        } 
        IOUtils.cleanup(null, writer); 
        IOUtils.cleanup(null, outputStream); 
    } 
 
    public static void main(String args[]) throws Exception { 
        Configuration config = new Configuration(); 
        FileSystem hdfs = FileSystem.get(config); 
        File sourceDir = new File(args[0]); 
        Path destFile = new Path(args[1]); 
        OutputStream os = hdfs.create(destFile); 
        writeToAvro(sourceDir, os); 
    } 
}

//对Avro数据文件的读取
public class AVRO_READ{ 
    private static final String FIELD_FILENAME = "filename"; 
    private static final String FIELD_CONTENTS = "contents"; 
 
    public static void readFromAvro(InputStream is) throws  IOException { 
        DataFileStream<Object> reader = new DataFileStream<Object>(is,new GenericDatumReader<Object>()); 
        for (Object o : reader) { 
            GenericRecord r = (GenericRecord) o; 
            System.out.println(r.get(FIELD_FILENAME)+ ":"+DigestUtils.md5Hex(((ByteBuffer)r.get(FIELD_CONTENTS)).array())); 
        } 
        IOUtils.cleanup(null, is); 
        IOUtils.cleanup(null, reader); 
    } 
 
    public static void main(String... args) throws Exception { 
        Configuration config = new Configuration(); 
        FileSystem hdfs = FileSystem.get(config); 
        Path destFile = new Path(args[0]); 
        InputStream is = hdfs.open(destFile); 
        readFromAvro(is); 
    } 
}  
  • 大小: 39.3 KB
分享到:
评论

相关推荐

    Apache Hadoop---Avro.docx

    Avro 的基本原理是通过 JSON 对象来定义数据模式,支持八种基本类型(如字符串、整型、浮点型等)和六种复杂类型(如记录、数组、映射等)。这些模式可以通过 JSON 字符串进行表示,允许用户创建复杂的数据结构。...

    avro-tool工具jar包

    1. **Avro模式(Schema)**:Avro数据必须基于一个模式定义,它描述了数据的结构,包括字段名、类型、顺序等。模式定义使得数据在不同系统间具有良好的互操作性,因为它规定了数据的结构。 2. **数据序列化**:Avro...

    avro_sample.rar

    在C++中,你需要理解如何定义和使用这些模式来创建和解析Avro数据。 2. **序列化与反序列化**:Avro提供了高效的二进制编码方式,使得数据可以在内存、磁盘和网络间高效传输。在C++中,你需要了解如何使用Avro库来...

    avro序列化

    1. **定义数据模式**:使用JSON编写Avro模式文件,描述数据的结构,包括字段名、数据类型等。 2. **生成数据对象**:根据模式文件,可以生成特定语言的类,这些类可以直接用来创建和操作数据对象。 3. **序列化**...

    Hadoop首选串行化系统——Avro简介及详细使用

    文章目录简介特点Avro数据类型和模式Avro基本类型Avro复杂类型Avro数据序列化/反序列化方法1 使用编译的方式序列化反序列化方法2 不使用编译的方式序列化反序列化 简介  Avro是Hadoop中的一个子项目,也是Apache...

    Avro 1.8.2 序列化规范

    综上所述,Avro 1.8.2序列化规范是一个全面的文档,不仅定义了Avro数据序列化的各种细节,而且也提出了模式演化、协议通信、容器文件以及逻辑类型的概念,这些都是在分布式系统中进行高效数据处理不可或缺的部分。

    avro资料

    4. **映射(Map)**:键值对的集合,键是字符串,值可以是任何Avro数据类型。 5. **固定大小的数据类型(Fixed)**:具有固定数量的字节的数据类型。 6. **Union(Union)**:允许一个字段可以是多种类型的任意一种...

    Hadoop权威指南 第二版(中文版)

     1.5.1 数据类型  1.5.2 操作和函数  1.6 表  1.6.1 托管表(Managed Tables)和外部表(External Tables)  1.6.2 分区(Partitions)和桶(Buckets)  1.6.3 存储格式  1.6.4 导入数据  1.6.5 表的修改  1.6.6 表...

    avro linux C++动态库

    这些头文件通常包含了如`&lt;avro/AvroSchema.h&gt;`,`&lt;avro/SpecificReader.h&gt;`等,涵盖了Avro的类型系统、序列化和反序列化函数、以及特定数据类型的模板类。 "lib"目录下的"so"文件(即Shared Object)是动态链接库的...

    Hadoop权威指南(中文版)2015上传.rar

    1.5.1 数据类型 1.5.2 操作和函数 1.6 表 1.6.1 托管表(Managed Tables)和外部表(External Tables) 1.6.2 分区(Partitions)和桶(Buckets) 1.6.3 存储格式 1.6.4 导入数据 1.6.5 表的修改 1.6.6 表的丢弃 1.7...

    HADOOP 相关项目简介

    1. **数据结构**:Avro 支持多种数据类型,如基本数据类型、数组、映射等,并且能够定义复杂的记录结构。 2. **二进制数据格式**:Avro 的二进制数据格式非常紧凑高效,能够有效减少数据传输的时间。 3. **容器文件*...

    avro-tool-1.5.0.jar.zip

    这对于理解Avro文件的内容和结构非常有用,同时也简化了与Avro数据的交互。 4. `fromjson` 和 `tojson`:这两个工具分别用于将Avro文件转换为JSON格式,以及将JSON数据写入Avro文件。这在需要在Avro和JSON之间进行...

    Hadoop序列化机制

    3. Apache Avro:Avro是Hadoop的一个子项目,它提供了一种紧凑、快速的序列化格式,支持动态类型和JSON数据模式。Avro不仅在Java中使用,还支持C++, Python等多种语言,使得跨语言通信变得容易。 4. Thrift:Thrift...

    基于Hadoop分布式系统的地质环境大数据框架探讨.pdf

    地质环境大数据是指在地质环境研究、管理和决策中产生的,其数据量庞大、数据类型多样、数据更新快速、价值密度高的数据集。在分析时,首先要对现有的地质环境数据特征进行归纳,然后根据大数据的“4V”特性(体积...

    hadoop in practice

    - **文本与非文本数据的序列化**:本书深入讲解了 Hadoop 中的数据序列化技术,包括如何处理文本数据以及如何超越文本格式处理更复杂的数据类型。通过介绍 Avro、Protobuf 和其他序列化框架,帮助读者掌握如何在 ...

    Thrift和Avro实例

    Thrift的数据类型包括基本类型(如整型、字符串、布尔值等)、复合类型(如结构体、枚举、映射和集合)以及服务定义。Thrift的编译器会将这些定义转换为各种编程语言的客户端和服务器端代码,使得服务提供者和消费者...

    thrift和avro研究资料1

    1. **强类型接口定义语言**:Thrift使用IDL(Interface Definition Language)来定义服务和数据类型,这使得服务可以在多种语言之间无缝通信。 2. **高效**:Thrift使用二进制协议,相比于XML等文本格式,它能减少...

    wsdl2avro:WSDL2Avro 是一个 Scala 库,可让您将数据类型从 SOAP WSDL 转换为 Avro 模式

    WSDL2Avro WSDL2Avro 是一个 Scala 库,可让您将数据类型从 SOAP WSDL 转换为 Avro 模式。 它采用 WSDL 文档的部分中定义的 XML 类型,并将它们转换为 Avro Schema 对象,然后可以以编程方式使用或保存到磁盘。 当您...

    Hadoop权威指南

    Avro是一种数据序列化系统,它使用JSON来定义数据类型和协议,适合于远程过程调用。Flume用于高效地聚合、收集和移动大量的日志数据。Sqoop是一个用于在Hadoop和结构化数据存储之间高效传输批量数据的工具。 Hadoop...

Global site tag (gtag.js) - Google Analytics