菜鸟先飞之Hadoop数据模型

本文介绍了Hadoop中常见的数据模型,包括Text的优缺点,SequenceFile的特性,如按行存储键值对,支持压缩;Avro的二进制数据格式和丰富的数据结构;Parquet的列式存储优势以及ORC的优化行列存储。还探讨了如何在Hive中使用这些格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Hadoop常用数据模型(文件存储格式)

1、Text:文本文件通常采用CSV、JSON等固度长度的纯文本格式
优点:
(1)便于与其他应用程序(生成或读取分隔文件)或脚本进行数据交换
(2)易读性好,便于理解
缺点:
(1)数据存储量非常庞大
(2)查询效率不高
(3)不支持块压缩

2、SequenceFile

(1)SequenceFile按行存储二进制键值对数据,HDFS自带
        1)二进制文件直接将<Key,Value>序列化到文件中
        2)常用于在MapReduce作业之间传输数据 
        3)可用作Hadoop中小文件的打包存档(小文件合并) 
        4)即使在压缩数据时也支持分割、

(2)键值对类型
        SequenceFile中的Key和Value可以是任意类型的Writable(org.apache.hadoop.io.Writable)

(3)Java API
        org.apache.hadoop.io.SequenceFile

(4)存储结构
        记录结构

        
        块结构

         0

        ps:记录的内部结构取决于是否启用压缩。如果已经启用压缩,则取决于是记录压缩还是数据块压缩

(5)压缩

         记录级(RECORD)


         块级(BLOCK):一次压缩多条记录,利用记录间的相似性进行压缩,效率更高

(6)读写操作

SequenceFile.Writer (指定为块压缩)

SequenceFile.Reader(读取时能够自动解压)

(7)查看文件内容

hdfs dfs -text myseqfile.seq

(8)在Hive中使用SequenceFile

//1.方式一
STORED AS sequencefile


//2.方式二显示指定
STORED AS INPUTFORMAT   'org.apache.hadoop.mapred.SequenceFileInputFormat' 
OUTPUTFORMAT  'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'

3、Avro:Apache Avro是一个数据序列化系统,出自Hadoop之父Doug Cutting

(1)Avro File:以JSON格式存储数据定义(Schema),以二进制格式存储数据

(2)特点    
      1)丰富的数据结构
      2)快速可压缩的二进制数据格式
      3)容器文件用于持久化数据
      4)自带远程过程调用RPC
      5)动态语言可以方便地处理Avro数据

(3)基本数据类型
      null, boolean, int, long, float, double, bytes, string

(4)复杂数据类型
      record、enum、array、map、union、fixed

(5)avro-tools应用

      准备工作:user.json   、user.avsc  、avro-tools-1.8.2、 avro-tools-1.8.2.jar

//user.json
{"name": "Alyssa", "favorite_number": 256, "favorite_color": "black"}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
{"name": "Charlie", "favorite_number": 12, "favorite_color": "blue"}
//user.avsc定义了User对象的Schema


{
"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
    {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": "int"},
     {"name": "favorite_color", "type": "string"}
 ]}

       1)使用schema+data生成avro文件

java -jar avro-tools-1.8.2.jar fromjson --schema-file user.avsc user.json > user.avro
java -jar avro-tools-1.8.2.jar fromjson --codec snappy --schema-file user.avsc user.json > user.avro

       2)avro转json

java -jar avro-tools-1.8.2.jar tojson user.avro
java -jar avro-tools-1.8.2.jar tojson user.avro --pretty

       3)获取avro元数据

java -jar avro-tools-1.8.2.jar getmeta user.avro

(6)Avro文件存储结构

(7)在Hive中使用Avro

create table CUSTOMERS 
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' 
tblproperties ('avro.schema.literal'='{ 
"name": "customer", "type": "record", 
"fields": [
{"name":"firstName", "type":"string"}, {"name":"lastName", "type":"string"}, 
{"name":"age", "type":"int"}, {"name":"salary", "type":"double"}, 
{"name":"department", "type":"string"}, {"name":"title", "type":"string"},
{"name": "address", "type": "string"}]}'); 

create external table user_avro_ext(
name string,
favorite_number int,
favorite_color string) 
stored as avro location '/tmp/avro'; 

4、Parquet

(1)Apache Parquet是Hadoop生态系统中任何项目都可用的列式存储格式,由Twitter和Cloudera合作开发

         Parquet格式是Spark SQL默认数据源

(2)列式存储优点
         1)按需读取列
         2)压缩编码可以降低磁盘存储空间

(3)Parquet文件结构

       1)行组Row Group
       2)列块Column Chunk
       3)页Page

      ps:按照行将数据物理上划分为多个组,每一个行组包含一定的行数,通常行组大小等于HDFS块大小

(4)Parquet Schema

(5)Parquet Java API

         ParquetWriter、ParquetReader

5、RC & ORC

(1)RC(Record Columnar)由Facebook开源
       1)存储行集合,并在集合中以列格式存储行数据
       2)引入轻量级索引,允许跳过不相关的行块
       3)可分割:允许并行处理行集合
       4)可压缩

(2)ORC(Optimized Row Columnar)
      RC优化版

 

(2)RCFile存储结构

1)集行存储与列存储的优点于一身
2)设计思想与Parquet类似,先按行水平切割为多个行组,再对每个行组内的数据按列存储



(3)ORCFile存储结构
        1)Stripe
             每个ORC文件首先会被横向切分成多个Stripe
             每个stripe默认的大小是250MB
             每个stripe由多组(Row Groups)行数据组成
        2)IndexData
             保存了该stripe上数据的位置,总行数
        3)RowData
             以stream的形式保存数据
        4)Stripe Footer
             包含该stripe统计结果:Max,Min,count等信息
        5)FileFooter
             该表的统计结果
             各个Stripe的位置信息
        6)Postscript
             该表的行数,压缩参数,压缩大小,列等信息
 

(4)Java读写ORCFile

        1)TypeDescription
        2)VectorizedRowBatch
        3)BytesColumnVector
        4)LongColumnVector
        5)Writer & Reader

(5)在Hive中使用ORCFile存储格式

方法一:

create external table user_orc_ext(
name string,
age int

stored as orc 
location '/tmp/users/orc'

方法二:

 

文件存储格式比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值