hive中的文件格式的简介

【hive中的file_format】

  • SEQUENCEFILE:生产中绝对不会用,k-v格式,比源文本格式占用磁盘更多
  • TEXTFILE:生产中用的多,行式存储
  • RCFILE:生产中用的少,行列混合存储,OCR是他得升级版
  • ORC:生产中最常用,列式存储
  • PARQUET:生产中最常用,列式存储
  • AVRO:生产中几乎不用,不用考虑
  • JSONFILE:生产中几乎不用,不用考虑
  • INPUTFORMAT:生产中几乎不用,不用考虑

【注意】hive默认的文件格式是TextFile,可通过set hive.default.fileformat 进行配置

【行式存储与列式存储】

  • 行式存储与列式存储数据物理底层存储区别

【结论:由上图可知】

  1. 行式存储一定会把同一行数据存到同一个块中,在select查询的时候,是对所有字段的查询,不可以单独查询某一行
  2. 列式存储同一列数据一定是存储到同一个块中,换句话说就是不同的列可以放到不同块中,在进行select查询的时候可以单独查询某一列。

【优缺点】

  • 列式存储

  1. 优点:当查询某个或者某几个字段的时候,只需要查看存储这几个字段的这几个block就可以了,大大的减少了数据的查询范围,提高了查询效率
  2. 缺点:当进行全字段查询的时候,数据需要重组,比单独查一行要慢
  • 行式存储

  1. 优点:全字段查询比较快
  2. 缺点:当查询一张表里的几个字段的时候,底层依旧是读取所有的字段,这样查询效率降低,并且会造成不必要的资源浪费,而且,生产中很少会出现需要全字段查询的场景

【hive文件格式配置实现以及对比】

  • 创建原始表默认TEXTFILE
  • CREATE EXTERNAL TABLE g6_access (
  • cdn string,
  • region string,
  • level string,
  • time string,
  • ip string,
  • domain string,
  • url string,
  • traffic bigint)
  • ROW FORMAT DELIMITED
  • FIELDS TERMINATED BY ‘\t‘
  • LOCATION ‘/g6/hadoop/access/clear/test/‘;
  • 导入测试数据
  • [[email protected] data]$ ll
  • -rw-r--r-- 1 hadoop hadoop 68051224 Apr 17 17:37 part-r-00000
  • [[email protected] data]$ hadoop fs -put part-r-00000 /g6/hadoop/access/clear/test/
  • 通过hue查看数据的大小    64.9MB

  • 创建以 SEQUENCEFILE格式储存的表g6_access_seq,并使用g6_access中的数据
  • create table g6_access_seq
  • stored as SEQUENCEFILE
  • as select * from g6_access ;
  • 查看数据大小   71.8MB

  • 结论:比默认的TEXTFILE格式的文件还要大,生产上基本上是不会用的
  • 创建RCFILE数据存储格式表,,并使用g6_access中的数据
  • create table g6_access_rc
  • stored as RCFILE
  • as select * from g6_access;
  • 查看数据大小  61.6MB

  • 结论:存储减少了3M左右,微不足道,读写性能也没有什么优势,生产也没有用他的理由
  • 创建ORCFILE数据存储格式表,,并使用g6_access中的数据,默认是使用zlib压缩,支持zlib和snappy
  • create table g6_access_orc
  • stored as ORC
  • as select * from g6_access;
  • 查看数据大小    17.0MB

  • 创建ORCFILE数据存储格式表,并使用g6_access中的数据
  • create table g6_access_orc_none
  • stored as ORC tblproperties ("orc.compress"="NONE")
  • as select * from g6_access;
  • 查看数据大小    51.5MB

  • 创建PARQUET数据存储格式表,不使用压缩,并使用g6_access中的数据
  • create table g6_access_par
  • stored as PARQUET
  • as select * from g6_access;
  • 结论:ORC文件不压缩,比源文件少了10多MB,ORC文件采用默认压缩,文件只有源文件的四分之一
  • 查看数据大小    58.3MB
  • 创建PARQUET数据存储格式表,设置使用gzip压缩格式,并使用g6_access中的数据
  • set parquet.compression=gzip;
  • create table g6_access_par_zip
  • stored as PARQUET
  • as select * from g6_access;

  • 结论:parquet格式文件大小是源文件的1/4左右。生产上也是好的选择

【读取数据量对比】

  • 直接执行 select 查询,观察日志 尾部HDFS Read: 190XXX ,就可知道读取数据量了

原文地址:https://www.cnblogs.com/xuziyu/p/10737199.html

时间: 2024-10-09 17:48:26

hive中的文件格式的简介的相关文章

Hive支持的文件格式和压缩格式及各自特点

Hive中的文件格式 1-TEXTFILE 文本格式,Hive的默认格式,数据不压缩,磁盘开销大.数据解析开销大. 对应的hive API为:org.apache.hadoop.mapred.TextInputFormat和org.apache.hive.ql.io.HiveIgnoreKeyTextOutputFormat: 可结合Gzip.Bzip2使用(系统自动检查,执行查询时自动解压),但是使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作 2-SequenceFile

(1)、hive框架搭建和架构简介

一.简介 Hive是基于hadoop的一个数据仓库工具,有助于查询和管理分布式存储系统中的数据集,非常适合数据仓库的统计分析 Hive 不适合用于连机事物处理.也不提供实时查询,比较适合在大量不可变数据的批处理作业. 二.下载与安装 1.下载hive压缩包,并复制到centos系统的/opt/module目录下 2.解压文件:tar -zxvf apache-hive-1.0.1-bin.tar.gz    执行重命名文件夹为  hive 3.添加hive-1.0.1到环境变量中,本文前提是已经

OSG中的示例程序简介

OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.MatrixTransform.PositionAttitudeTransform等四种类型的节点上.二)演示了osgSim::OverlayNode

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer).但是对于大量数据这将会消耗很长的时间去执行. 这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来

kettle连接Hive中数据导入导出(6)

1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive 表输入 1)往excel中写数据 2)往文本文件中写数据 注:这里需要填上hive的表名.字段名,不然会报如下错误: 2016/07/27 15:43:01 - 表输入.0 - ERROR (version 3.2.0, build 1 from 2016-07-07 10.46.10 by xnren

hive中partition如何使用

1.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表时指定的partition的分区空间. 3.如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构. 2.细节 1.一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下. show partitions stage_

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数

Hive中分组取前N个值

分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列.在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同

sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案 1.问题描述: 用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,后面的‘HH24:mi:ss’被自动截断了,在对时间要求到秒级的分析处理中这种截断会产生问题. 2.解决方案: 在用sqoop倒入数据表是,添加--map-column-hive 和--map-column-jav