草庐IT

【Hive】建表时的存储格式

郝少 2024-01-01 原文

目录

一、简介

1、hive建表时存储格式

2、五种存储格式的区别

二、实践操作

1、textfile

2、sequencefile

3、rcfile 

4、orc

5、parquet

三、适用场景


一、简介

1、hive建表时存储格式

          一般情况下hive在创建表时默认的存储格式是textfile,hive常用的存储格式有五种,textfile、sequencefile、rcfile、orc、parquet。

2、五种存储格式的区别

hive五种存储格式的区别
存储格式文件存储编码格式建表指定
textfile

将表中的数据在hdfs上以正常文本的格式存储,下载后可以直接查看。

stored as textfile

sequencefile  

将表中的数据在hdfs上以二进制格式编码,并将数据压缩,下载的数据是二进制格式,不可以直接查看,无法可视化。

stored as sequecefile
rcfile  将表中的数据在hdfs上以二进制格式编码,并且支持压缩。下载后的数据无法可视化。stored as rcfile
orc文件存储方式为二进制文件。orc文件格式从hive0.11版本后提供,是RcFile格式的优化版,主要在压缩编码,查询性能方面做了优化。按行组分割整个表,行组内进行列式存储。stored as orc
parquet文件存储方式为二进制文件。parquet基于dremel的数据模型和算法实现,列式存储。stored as parquet

textfile利弊:

  • 基于行存,每一行就是一条记录。
  • 可以使用任意的分隔符进行分割。
  • 无压缩,造成存储空间大。

sequencefile利弊:

  • 基于行存储。
  • sequencefile存储格有压缩,存储空间小,有利于优化磁盘和I/O性能。
  • 同时支持文件切割分片,提供了三种压缩方式:none,record,block(块级别压缩效率跟高).默认是record(记录)。

rcfile利弊:

  • 行列混合的存储格式,基于列存储。
  • 因为基于列存储,列值重复多,所以压缩效率高。
  • 磁盘存储空间小,io小。

orc利弊:

  • 具有很高的压缩比,且可切分;由于压缩比高,在查询时输入的数据量小,使用的task减少,所以提升了数据查询速度和处理性能。每个task只输出单个文件,减少了namenode的负载压力。
  • 在ORC文件中会对每一个字段建立一个轻量级的索引,如:row group index、bloom filter index等,可以用于where条件过滤。
  • 查询速度比rcfile快;支持复杂的数据类型;
  • 无法可视化展示数据;读写时需要消耗额外的CPU资源用于压缩和解压缩,但消耗较少;
  • 对schema演化支持较差;

parquet利弊:

  • 具有高效压缩和编码,是使用时有更少的IO取出所需数据,速度比ORC快,其他方面类似于ORC。
  • 不支持update和ACID。
  • 不支持可视化展示数据。

二、实践操作

        下图红框标出的部分是利用hadoop本身InputFormat API从不同的数据源读取数据,OutputFormat API将数据写成不同的格式。所以对于不同的数据源,不同的存储格式就需要不同对应的InputFormat和Outputformat类来实现。

1、textfile

CREATE TABLE teacher(
 name string,
 age int
)row format delimited fields terminated by ','
stored as textfile;

2、sequencefile

CREATE TABLE teacher01(
 name string,
 age int
)stored as sequencefile;

 这里没有使用row format delimited fields terminated by ',',是因为没有必要,单纯的load以逗号分隔的文本进去会报错。

FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.

3、rcfile 

CREATE TABLE teacher02(
 name string,
 age int
)stored as rcfile;

 这里也没有使用row format delimited fields terminated by ',',是因为没有必要,单纯的load以逗号分隔的文本进去会报错。

4、orc

CREATE TABLE teacher03(
 name string,
 age int
)stored as orc;

 这里也没有使用row format delimited fields terminated by ',',是因为没有必要,单纯的load以逗号分隔的文本进去会报错。

5、parquet

CREATE TABLE teacher04(
 name string,
 age int
)stored as parquet;

 这里也没有使用row format delimited fields terminated by ',',是因为可以load以逗号分隔的文本进去。但是select 查询会报错。

hive> select * from teacher12;
OK
Failed with exception java.io.IOException:java.lang.RuntimeException: hdfs://master.com:8020/user/hive/warehouse/teacher12/teacher.txt is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [44, 49, 52, 10]
Time taken: 0.095 seconds

三、适用场景

  • 需要查看所存储的具体数据内容的小型查询,可以采用默认文件格式textfile。
  • 不需要查看具体数据的小型查询时可使用sequencefile文件格式。
  • 当用于大数据量查询时,可以使用rcfile、orc、parquet文件格式,一般情况下推荐使用orc,若字段数较多,不涉及到更新并且需要部分列查询场景多的情况下建议使用parquet。
  • 需通过sqoop+hive与关系型数据库交互时,import和export的hive表需要使用textfile格式。如果需要操作的表不是textfile存储格式,需要先insert到textfile格式的表中再操作。

有关【Hive】建表时的存储格式的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  4. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  7. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  8. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  9. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  10. ruby-on-rails - 如何在 Rails 中设置路由的默认格式? - 2

    路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。

随机推荐