hive表存储格式化
A. 怎样修改hive存储格式为snappy格式
你输入sqoop
import
的目录在哪里?如果在/usr/sqoop下输入的命令,那么在/usr/sqoop下输入hive登入,然后show
tables查看。
你输入sqoop
import
的目录在哪里?如果在/usr/sqoop下输入的命令,那么在/usr/sqoop下输入hive登入,然后show
tables查看。
hive
0.13以后自带支持。
B. 【大数据-数仓】HIVE下的文件存储遇到的一个问题(TEXTFILE、RCFILE)
问题:
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
解决:
当遇到这个肆激问题时,可以肯定一点的是,文件的格式和建表时指定的存储格式是不一致的。
由此可以定位到问题出在纳雹宴哪里了。
1.确定数洞银据源的格式:
一般都是txt/csv文件
2.确定建表时指定的存储格式
show create table table_name;
然后查看:
STORED AS INPUTFORMAT #指定的存储格式
3.重新建表并修改指定的存储格式
C. [hive]一种基于Hive日志分析的大数据存储优化方法_王正也_百度文库
一种悄或基于Hive日志分析的大数据存储优化方法 王正也 网络文库
http://wenku..com/link?url=-
2 一种基于Hive日志的大数据存储优化方法
2.1 优化方法概述
Hive作为Hadoop开源分布式平台下的数据仓库工具,他的作用是HDFS上存储的结构化数据,根据使用者的需求将其映射出数据表,并可以向用户提供类似SQL的HiveQL查询功能,并将用户提交的Query转换成Map-Rece任务执行。Hive的优点是提供类SQL的查询接口,快速实现数据的统计分析功能,而不必编写专用的Map-Rece任务。而也正是因为如此,通用的Hive数据仓库,没有进行专用化的优化设计,其查询分析效率也有很大的优化空间[4]。
文章根据常用的HiveQL的查询日志分析和根据现有的数据存储结构的关联特性提出一种通用的Hive数据存储的优化方法。
本策略认为优化一个专用的Hive海量数据仓库分为以下几个步骤: 1. 分析常用查询日志,根据使用人员习惯定制数据分区结构。 2. 使用专用的优化过的列式存储结构作为数据导入格式。 3. 根据数据表,和表中字段的实际物理意义尘携合并压缩重复字段和数据表。 4. 根据数据表中字段实际的取值优化字段的存储类型。 5. 编写UDF,在不改变用户使用习惯的基础上,应用上述优化。 其中1.2.两点在数据导入阶段进行优化,3.4.5.是在对数据表字段和表结构的优化,需要配合UDF来进行。通过上述优化过程可以大大节省HiveQL的查询时间以及HDFS上数据的占用空间。
2.2 根据查询日志进行分区优化
Hive的日志记录了Hive的运行状况,为本文分析操作者的使用习惯提供了很大的帮助。可以通过编写Hive的EXPAIN功能进行日志的分析,利用Hive的EXPLAIN功能,本文可以得到查询语句的抽象语法树(ABSTRACT SYNTAX TREE),通过抽象语法树,本文可以快速得到查询语句的语法结构。
例如,以下一条语句SELECT col1, SUM(col2) FROM tab1 GROUP BY col1的通过EXPLAIN命令本文可以得到如下结果:
ABSTRACT SYNTAX TREE:
(TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME tab1))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL col1)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL col2)))) (TOK_GROUPBY (TOK_TABLE_OR_COL col1))))
可以通过使用正则表达式抓取特征数据,得到该语句的语法结构,同时通过编写Shell脚本,批量执行EXPLAIN命令,可以很快的启兄伍理解到使用者的常用语法习惯,为后文的分区优化提供了数据支持。 通过对使用者常用字段进行分区(partition),带来的便利是大大的节省了一些常用查询的在硬盘中读取数据所消耗的时间。 通常在没有进行过优化的Hive系统中,每次查询提交之后,Hive要对输入数据进行全盘扫描满足条件的的项目,通过合理的划分分区,在单次任务提交后,可以按照任务的限定条件只扫描某些关键分区的数据,大大提高的Hive查询执行的效率。
2.3 选取合适的Hive数据存储格式
在Hive中数据表创建时需要指定文件存储格式,在Hive0.90版本中,常用的数据格式分为TEXTFILE、SEQUNCEFILE、RCFILE和用户自定格式等几种,以上格式的主要区别在行式存储与列式存储,不同压缩算法等方面的区别。根据Hive数据表格的特性,和通过Hive日志观察到的用户使用习惯等特性,通过选择合适的文件存储格式,可以大大提高查询效率,减少查询耗费时间。
4 结论
本文给出了一种基于Hive日志分析的大数据存储优化方法,通过实际测试可以看出,使用该优化方法的Hive数据存储系统无论从磁盘空间利用率还是从查询效率上都得到和很大提升。
D. hive存储parquet表
parquet格式的表在生产环境中经常被使用到,具有列式存储和压缩等特点,我们怎么在hive中存储parquet格式的表呢。
这里使用oracle的emp表
加载本地数据到hive表
执行查询
发现报错
emp使用parquet格式存储,其中imputFormat和outputFormat都是parquet的相关的,也前册就是我的imputFormat是parquent的,但是你传过来的是text,我不认识
我们看一下emp的相关信息,可以看到这里的都是parquet的format的,这是导致这次错误的原因。
这就导致了我们需要每次都先把text文件转化为parquet的文件,然后parquent表进行加载才可以,下面介绍官方推荐的使用方法。
查看emp_tmp的表的信息,这里可以看到,默认的是TextImputFormat和TextOutputFormat的。
然后加载数据到emp_tmp,查看数据,是正常显示的
然后现在把之前的emp里面的数据给删除
然后把emp_tmp表里面的数据加载到emp
查询一下,数据滑谈正常显示,这个方式使用起来还行,就是每次都需要对临时表进行操作,还是比较麻烦的。
感觉这个问题是经常出现,为什么会这样呢。这个和hive的版本有一定的关系。
可以看出hive官方将inputformat和outputformat进行了整合,这样使信悔碰用起来也是比较方便的。
但是可能有人想,那我修改inputformat不就行了,下面我介绍一下,看是否可以
创建emp2表,是parquet的存储格式的
修改inputformat 和serde,这里inputFormat是TextInputFormat,SEDE使用的是LazySimpleSerDe,Outputformat任然是Parquet的,这里需要带上。
查看emp2表的信息,如下图表示修改成功
加载数据到emp2
查询数据,执行成功
到这里,修改inputformat和serde的方法也介绍完成了,我们以为成功了,但是上hdfs上一看,文件还是txt格式的,所以通过修改inputformat和serde的方法不行。
肯定有人想使用这个方法
这个方法我也尝试了,但是返回的值全都是null
在仅仅使用hive的时候,如果想把txt文件里面的数据保存到parquet表里面的话,可以使用建立临时表的方法,这个方法也是比较好操作的。
但是其实如果使用spark,flink等分布式计算引擎的话,是可以直接的读取txt数据保存到parquet表里面的,框架帮我们做了转化。这种方式也是我们在工作中经常使用的。
上面也介绍了修改inputformat和ser的方式,秀给inputformat是可以让txt文件里面的数据被读进来的,如果同时还修改了serde为lazysimpleserde的话,这个是把数据保存为text格式的,已经完全和parquet没有关系了,保存的文件还是txt格式的。仅修改inputformat,但是使用的serde是parquet的,但是数据进出不一致,也是有问题的。
E. Hive数据的序列化格式
1. TextFile
Hive数据表的默认格式,存储方式:行存储。
可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split。
但在或高反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。
2. SequenceFile
Hadoop API提供的一种二进制文件,以的形式序列化到文件中,存储方式:行存储。
支持三种压缩选择:NONE,RECORD,BLOCK。
Record压缩率低,一般建议使用BLOCK压缩。
优势是文件和hadoop api中的MapFile是相互兼容的。
3. RCFile
存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:
首先,RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低;孙慎
其次,像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取;
RCFile的一个行组包括三个部分:
第一部分是行组头部的【同步标识】,主要用于分隔 hdfs 块中的两个连续行组
第二部分是行组的【元数据头部】,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数
第三部分是【表格数据段】,即实际的列存储数据。在该部分中,同一列的所有域顺序存储。
从图可以看出,首先存储了列 A 的所有域,然后存储列 B 的所有域等。
数据追加:RCFile 不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的 HDFS当前仅仅支持数据追加写文件尾部。
行组大小:行组变大有助于提高数据压缩的效率,但是可能会损害数据的读取性能,因为这样增加了 Lazy 解压性能的消耗。而且行组变大会占用更多的内存,这会影响并发执行的其他MR作业。 考虑到存储空间和查询效率两个方面,Facebook 选择 4MB 作为默认的行组大小,当然也允许用户自行选择参数进行配置。
4. ORCFile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
5. 自定义格式
用户可以通过实现inputformat和 outputformat来自定义输入输出格式。
6. 总结:
数据仓库的特点:一次写入、多次读取,因此,整体来看, ORCFile 相比其他格式具有较明显的优势。
TextFile 默认格式,加载速度最快,可以采用Gzip、bzip2等进衫凯尺行压缩,压缩后的文件无法split,即并行处理
SequenceFile 压缩率最低,查询速度一般,三种压缩格式NONE,RECORD,BLOCK
RCfile 压缩率最高,查询速度最快,数据加载最慢。
#