设为首页 收藏本站
查看: 640|回复: 0

[经验分享] Hadoop_Avro数据类型与模式

[复制链接]

尚未签到

发表于 2016-12-12 07:48:47 | 显示全部楼层 |阅读模式
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.                  }
           
                                                                                       
recordA 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"}
                                                                ]                                       
                                                                }                                       


enumA 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                             
                                                                }                                      


unionA 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"}
                                                                      ]  
DSC0000.png
通过上图所示,通过程序可以将本地的小文件进行打包,组装成一个大文件在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);  
    }  
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312889-1-1.html 上篇帖子: Hadoop(二)对话单的操作 下篇帖子: hadoop作业的优化常用手段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表