hive文件格式速度|hvie与关系型数据库有什么区别

hive文件格式速度|hvie与关系型数据库有什么区别的第1张示图

『壹』 hive查询时间复杂度

1、使用Tez引擎Apache Tez Engine是一个可扩展的框架,用于构建高性能批处理和交互式数据处理。它由YARN在Hadoop中 调度。Tez通过提高处理速度和保持MapRece扩展到数PB数据的能力来改进MapRece job。通过设置hive.execution.engine 为tez:可以在环境中启用Tez引擎:set hive.execution.engine=tez;2、使用向量化向量化通过在单个操作中获取 1024 行而不是 每次只获取单行来改善 scans, aggregations, filters 和 join 这类操作的性能。我们可以通过执行以下命令在环境中启用向量化:set hive.vectorized.execution.enabled=true; set hive.vectorized.execution.rece.enabled=true;3、使用ORCFileHive 支持 ORCfile,这是一种新的表存储格式,在读取,写入和处理数据时,ORCFile格式优于Hive文件格式,它通过 predicate push-down, compression 等技术来提高查询速度。在 HIVE 表中使用 ORCFile,将有益于获得 HIVE 快速响应的查询。ORCFile 格式通过对原始数据存储量压缩75%,提供了高效的存储 Hive 数据的方法。举例,考虑两个大表 A 和 B(存储为 TextFIle,这里没有指定一些列),使用一个简单的查询,如:SELECT A.customerID, A.name, A.age, A.addressJOIN B.role, B.department, B.salary ON A.customerID=B.customerID;由于表 A 和表 B 都存储为 TextFile,因此执行此查询可能需要很长时间。将这些表存储格式转换为 ORCFile 格式通常会明显减少查询时间:CREATE TABLE A_ORC ( customerID int, name string,age int, address string ) STORED AS ORC tblproperties (“orc.compress" = “SNAPPY”);INSERT INTO TABLE A_ORCSELECT *FROM A;CREATE TABLE B_ORC ( customerID int, ROLE string,salary float, department string ) STORED AS ORC tblproperties (“orc.compress" = “SNAPPY”);INSERT INTO TABLE B_ORCSELECT *FROM B;SELECT A_ORC.customerID, A_ORC.name, A_ORC.age, A_ORC.addressJOIN B_ORC.role, B_ORC.department, B_ORC.salary ON A_ORC.customerID=B_ORC.customerID;ORC 支持压缩存储(使用 ZLIB 或如上所示使用 SNAPPY),但也支持不压缩存储。4、使用分区通过分区,数据存储在 HDFS 上的单独单个文件夹中。Hive 将查询分区数据集,而不是 扫描表的所有数据集。创建临时表并将数据加载到临时表中CREATE TABLE Employee_Temp(EmloyeeID int, EmployeeName Varchar(100),Address Varchar(100),STATE Varchar(100),City Varchar(100),Zipcode Varchar(100)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; LOAD DATA INPATH '/home/hadoop/hive' INTO TABLE Employee_Temp;创建分区表Create Table Employee_Part(EmloyeeID int, EmployeeName Varchar(100), Address Varchar(100),State Varchar(100),Zipcode Varchar(100))PARTITIONED BY (City Varchar(100))ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','STORED AS TEXTFILE;启用动态分区的命令SET hive.exec.dynamic.partition = true;SET hive.exec.dynamic.partition.mode = nonstrict;从临时表导入数据到分区表INSERT Overwrite TABLE Employee_Part Partition(City)SELECT EmployeeID, EmployeeName, Address, STATE, City, ZipcodeFROM Emloyee_Temp;5、使用 分桶桶表介绍:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables举例:https://blog.csdn.net/m0_37534613/article/details/55258928Hive 表被划分为多个分区,称为 Hive分区。Hive分区进一步细分为集群或桶,称为 bucket 或 Cluster。Create Table Employee_Part(EmloyeeID int, EmployeeName Varchar(100), Address Varchar(100),State Varchar(100),Zipcode Varchar(100))PARTITIONED BY (City Varchar(100))Clustered By (EmployeeID) into 20 BucketsROW FORMAT DELIMITEDFIELDS TERMINATED BY ','STORED AS TEXTFILE;6、CBO 查询优化器Hive CBO 是使用 Apache calcite 来处理的。早期的 Hive 版本中(Hive-0.14 之前),在提交最终执行之前,Hive 会优化每个查询的逻辑和物理执行计划。 这些优化不是基于查询的成本优化(Cost-based Optimizer) 。直到 Hive-0.14 时才添加了 Cost-based optimization ,这时已经根据查询的成本进行优化(例如要执行的连接类型,如何排序连接,并行度等)。要使用基于成本的优化,需要在查询开头设置以下参数set hive.cbo.enable=true;set hive.compute.query.using.stats=true;set hive.stats.fetch.column.stats=true;set hive.stats.fetch.partition.stats=true;如果要收集表信息,请使用 Analyze 命令。7、写好的 SQLSQL是一种强大的声明性语言。 与其他声明性语言一样,编写SQL语句的方法不止一种。 尽管每个语句的功能都相同,但它可能具有截然不同的性能特征。我们来看一个例子。 考虑点击流事件表:CREATE TABLE clicks ( timestamp date, sessionID string, url string, source_ip string ) STORED as ORC tblproperties (“orc.compress” = “SNAPPY”);每条记录代表一次点击事件,我们希望找到每个sessionID的最新网址。有人可能会考虑以下方法:SELECT clicks.* FROM clicks inner join (select sessionID, max(timestamp) as max_ts from clicks group by sessionID) latest ON clicks.sessionID = latest.sessionID and clicks.timestamp = latest.max_ts;在上面的查询中,我们构建一个子查询来收集每个会话中最新事件的时间戳,然后使用 内联接 来过滤掉其余的事件。虽然查询是一个合理的解决方案, 但是从功能的角度来看 ,有一种更好的方法来重写这个查询,如下所示:SELECT * FROM (SELECT *, RANK() over (partition by sessionID, order by timestamp desc) as rank FROM clicks) ranked_clicks WHERE ranked_clicks.rank=1;在这里,我们使用 Hive 的 OLAP 窗口功能(OVER 和 RANK)来实现相同的功能。显然,删除不必要的连接几乎总能带来更好的性能,而且当使用大数据时,这比以往任何时候都更重要。 我发现很多情况下查询不是最优的 – 所以仔细查看每个查询并考虑重写是否可以使它更好更快。————————————————版权声明:本文为CSDN博主「highfei2011」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/high2011/article/details/96271903

『贰』 hive和mysql的区别是什么

1、查询语言不同:

hive是hql语言,mysql是sql语句;

2、数据存储位置不同:

hive是把数据存储在hdfs上,而mysql数据是存储在自己的系统中;

3、数据格式不同:

hive数据格式可以用户自定义,mysql有自己的系统定义格式;

4、数据更新不同:

hive不支持数据更新,只可以读,不可以写,而sql支持数据更新。

『叁』 hive为什么还需要关系数据库

关系数据库里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。Hive在加载数据时候和关系数据库不同,hive在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式(schema on read)”。在实际应用中,写时模式在加载数据时候会对列进行索引,对数据进行压缩,因此加载数据的速度很慢,但是当数据加载好了,我们去查询数据的时候,速度很快。但是当我们的数据是非结构化,存储模式也是未知时候,关系数据操作这种场景就麻烦多了,这时候hive就会发挥它的优势。

『肆』 究竟是什么让Redshift比Hive快10倍

究竟是什么原因产生了如此悬殊的速度,有网友在Quora上提出了这个问题,并得到了Reynold Xin的解答:Redshift采用了专有的叫做ParAccel的并行数据库实现机制。我想在很多工作情境中,你会发现大多数并行数据库引擎要比Hive快。接下来,我将给出答案,并解释其中的某些原因。请注意的是,虽然该答案针对的是ParAccel,其中的大部分因素也适用于Vertica、Greenplum、OracleRAC等并行数据库。在答案中呢,我将使用三个可互换的术语“并行数据库”、“关系型数据库”和“分析型数据库”。比起并行数据库,Hive在可扩展性、灵活度方面遥遥领先。例如,Facebook使用Hive数据仓库跨越成千上万个节点。说起灵活度,Hive设计的初衷是与一些系列存储系统(HDFS、HBase、S3)配合使用,并能够支持多种输入格式(压缩、未压缩、Avro、纯文本、JSON)。易扩展和高灵活度在给你带来便利的同时,却也阻碍了你构建性能更好的查询引擎。接下来,我将列举哪些特征会影响查询性能:数据格式:数据以类似纯文本文件,相对未优化的形式存储在HDFS中。Hive 作业在处理数据之前,需要先花大量时间从硬盘中读取数据,再反序列化这些数据。发起任务的系统开销:Hadoop MapRece 使用心跳机制(heartbeats)制定作业计划,每项任务作为一独立的JVM过程发起。在Hadoop MapRece 中,仅仅是发起一项作业就需要几十秒钟,在秒级时间单位内,是无法运行任何进程的。相反,并行数据库拥有持续进程或线程池,它们能够大大减少任务安排及发起所需要的系统开销。中间数据物化 vs数据传输:Hive 使用拥有二阶模型(Map和Rece)的MapRece来执行。通常一个复杂的SQL查询被映射为MapRece的多个阶段,不同阶段的中间数据在硬盘上物化。并行数据库内置有用于执行SQL查询的引擎,执行查询时,该引擎在查询操作符和数据流(steram data)之间跨节点传递数据。列数据格式:列数据库将数据按照列式的格式进行存储。在典型的数据仓库中,每张数据表能够存储成百上千列,而大多数查询仅查找少数列。让我们来考虑一下如下查询,要查找的是沃尔玛每家店的营业额。它仅需要查找两三列(商店的编号、每件商品的零售价,或者还有销售日期)。以列式存储数据,执行查询时,引擎可以跳过不相关的列。这样可以减少上百次的硬盘I/O。此外,按列存储数据能够大大增加压缩比率。列查询引擎:除了上面提到的按列式存储的数据格式,还可以按列构建查询执行引擎,该引擎在分析型工作负载方面得到了较好的优化。其中的技巧包括:晚期物化(late materialization)、直接操作压缩过的数据、利用现代CPU提供的向量化操作(SIMD)。更快的S3连接:在这里我将给出一个大胆的猜测:AWS可能已经为他们的Redshift实例实现了一个比普通S3能够提供的更高带宽的S3整体负载。我需要申明,我们刚刚讨论的这些因素是基于Hive当前版本(2013年2月)。毫无置疑,Hive社区将会推进开发工作,并解决其中的一些难题。

『伍』 hive文件格式

hive支持的存储格式:hive支持的存储格式包括TextFile、SequenceFile、RCFile、Avro Files、ORC Files、Parquet。TextFile:Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。SequenceFile:SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。SequenceFile的文件结构图:Header通用头文件格式:SEQ 3BYTE Nun 1byte数字 keyClassName ValueClassName compression (boolean)指明了在文件中是否启用压缩 blockCompression (boolean,指明是否是block压缩) compression codec Metadata 文件元数据 Sync 头文件结束标志 Block-Compressed SequenceFile格式RCFileRCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。

『陆』 Hive基础之Hive是什么以及Hive使用场景

Hive是什么1)Hive是建立在Hadoop(HDFS/MR)上的用于管理和查询结果化/非结构化的数据仓库;2)一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制;3)Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据;4)允许用Java开发自定义的函数UDF来处理内置无法完成的复杂的分析工作;5)Hive没有专门的数据格式(分隔符等可以自己灵活的设定);ETL的流程(Extraction-Transformate-Loading):将关系型数据库的数据抽取到HDFS上,hive作为数据仓库,经过hive的计算分析后,将结果再导入到关系型数据库的过程。Hive是构建在Hadoop之上的数据仓库1)使用HQL作为查询接口;2)使用HDFS作为存储;3)使用MapRece作为计算;Hive应用场景数据源:1)文件数据,如中国移动某设备每天产生大量固定格式的文件;2)数据库以上两种不同的数据源有个共同点:要使用hive,那么必须要将数据放到hive中;通常采用如下两种方式:1)文件数据:load到hive2)数据库:sqoop到hive数据的离线处理;hive的执行延迟比较高,因为hive常用于数据分析的,对实时性要求不高;hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。处理数据存放在hive表中,那么前台系统怎么去访问hive的数据呢?先将hive的处理结果数据转移到关系型数据库中才可以,sqoop就是执行导入导出的操作

『柒』 如何解决spark写hive慢的问题

dataframe.registerTempTable("result")sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate') select * from result""")而整个结果数据的产生只需要4分钟左右的时间,比如以下方式:将结果以textfile存入hdfs:result.rdd.saveAsTextFile(output_tmp_dir)由此可见,对hive的写入操作耗用了大量的时间。对此现象的优化可以是,将文件存为符合hive table文件的格式,然后使用hive load将产生的结果文件直接move到指定目录下。代码如下:result.rdd.map { r => r.mkString("\001") }.repartition(partitions).saveAsTextFile(output_tmp_dir)sql(s"""load data inpath '$output_tmp_dir' overwrite into table $output partition (dt='$dt')""")

『捌』 leashive是什么文件

Hive的数据分为表数据和元数据,表数据是Hive中表格(table)具有的数据;而元数据是用来存储表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。hive文件存储格式包括以下几类:1、TEXTFILE2、SEQUENCEFILE3、RCFILE4、ORCFILE(0.11以后出现)其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中,然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

『玖』 大数据Hive仓库是什么

么是Hive——大数据仓库Hive基础 Hive是什么: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能;其本质是将HQ

『拾』 hvie与关系型数据库有什么区别

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapRece任务进行运行。

优点:学习成本低,可以通过类SQL语句快速实现简单的MapRece统计,不必开发专门的MapRece应用,十分适合数据仓库的统计分析。

hive与关系型数据库的区别

1、数据加载

关系数据库:表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。

Hive:hive在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式”。

在实际应用中,写时模式在加载数据时候会对列进行索引,对数据进行压缩,因此加载数据的速度很慢,但是当数据加载好了,我们去查询数据的时候,速度很快。

但是当我们的数据是非结构化,存储模式也是未知时候,关系数据操作这种场景就麻烦多了,这时候hive就会发挥它的优势。

2、

关系数据库:可以对某一行或某些行的数据进行更新、删除操作。更新、事务和索引等等。

hive:不支持对某个具体行的操作,也不支持事务和索引,hive对数据的操作只支持覆盖原数据和追加数据。

hive的设计是对海量数据进行处理,全数据的扫描时常态。针对某些具体数据进行操作的效率是很差的,对于更新操作,hive是通过查询将原表的数据进行转化最后存储在新表里,这和传统数据库的更新操作有很大不同。

3、

Hive也可以在hadoop做实时查询上做一份自己的贡献,那就是和hbase集成,hbase可以进行快速查询,但是hbase不支持类SQL的语句,那么此时hive可以给hbase提供sql语法解析的外壳,可以用类sql语句操作hbase数据库。

未经允许不得转载:山九号 » hive文件格式速度|hvie与关系型数据库有什么区别

赞 (0)