02-Hive/Hadoop数据存储格式与avro文件创建hive表

Hive/Hadoop数据存储格式与avro文件创建hive表


一.存储格式
1.Hadoop 中的文件格式
1>.SequenceFile
   SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。如果你用Java API 编写SequenceFile,并让Hive 读取的话,请确保使用value字段存放数据,否则你需要自定义读取这种SequenceFile 的InputFormat class 和OutputFormat class。
2>.RCFile
   RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
3>.Avro
  Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。并且Avro数据文件天生是带Schema定义的,所以它不需要开发者在API 级别实现自己的Writable对象。最近多个Hadoop 子项目都支持Avro 数据格式,如Pig 、Hive、Flume、Sqoop和Hcatalog。
4>.文本格式
  除上面提到的3种二进制格式之外,文本格式的数据也是Hadoop中经常碰到的。如TextFile 、XML和JSON。 文本格式除了会占用更多磁盘资源外,对它的解析开销一般会比二进制格式高几十倍以上,尤其是XML 和JSON,它们的解析开销比Textfile 还要大,因此强烈不建议在生产系统中使用这些格式进行储存。 如果需要输出这些格式,请在客户端做相应的转换操作。 文本格式经常会用于日志收集,数据库导入,Hive默认配置也是使用文本格式,而且常常容易忘了压缩,所以请确保使用了正确的格式。另外文本格式的一个缺点是它不具备类型和模式,比如销售金额、利润这类数值数据或者日期时间类型的数据,如果使用文本格式保存,由于它们本身的字符串类型的长短不一,或者含有负数,导致MR没有办法排序,所以往往需要将它们预处理成含有模式的二进制格式,这又导致了不必要的预处理步骤的开销和储存资源的浪费。
  5>.外部格式
  Hadoop实际上支持任意文件格式,只要能够实现对应的RecordWriter和RecordReader即可。其中数据库格式也是会经常储存在Hadoop中,比如Hbase,Mysql,Cassandra,MongoDB。 这些格式一般是为了避免大量的数据移动和快速装载的需求而用的。他们的序列化和反序列化都是由这些数据库格式的客户端完成,并且文件的储存位置和数据布局(Data Layout)不由Hadoop控制,他们的文件切分也不是按HDFS的块大小(blocksize)进行切割。
2.hive的文件格式
    TEXTFILE //文本,默认值
    SEQUENCEFILE // 二进制序列文件
    RCFILE //列式存储格式文件 Hive0.6以后开始支持
    ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
    PARQUET //列出存储格式文件,Hive0.13以后开始支持


二.avro文件加载数据到hive表中
    1.需要根据.avro文件中的schema结构生成.avsc文件进行hive表的创建,也可以手动根据源数据创建
        (生成.avsc文件需要下载avro-tools-1.8.2.jar ,通过java -jar avro-tools-1.8.2.jar安装,执行java -jar avro-tools-1.8.2.jar getschema xxxx/part-m-00000.avro >~/xxx.avsc文件)

     下载链接http://apache.mirrors.tds.net/avro/avro-1.8.2/java/avro-tools-1.8.2.jar
    2.创建根据.avsc文件创建hive表加载数据
        CREATE EXTERNAL TABLE 库名.表名   
        COMMENT "A table backed by Avro data with the Avro schema stored in HDFS"
        ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
        STORED AS
        INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
        OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
        LOCATION '/data/db_biz/history/item' --对应hdfs文件目录()
        TBLPROPERTIES (
            'avro.schema.url'='hdfs:///data/orders.avsc' -- 指定avsc文件创建表结构
        );
    3.将avro文件上传到指定目录
        hadoop fs -put /home/hadoop/xxx.avro hdfs://hadoop:90000/data/db_biz/history/item/
    
    4.查询、验证
        表结构:describe analysis.ods_Item;
        表数据:select count(*) from  analysis.ods_Item;

 

你可能感兴趣的:(Hive,数仓,avro)