barriers / 阅读 / 详情

hive和mysql的区别是什么?

2023-07-21 08:30:35
TAG: ive mys iv ys my sq sql hive
共1条回复
max笔记

hive和mysql的区别有:

1、查询语言不同:hive是hql语言,mysql是sql语句;

2、数据存储位置不同:hive是把数据存储在hdfs上,而mysql数据是存储在自己的系统中;

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

4、数据更新:hive不支持数据更新,只可以读,不可以写,而sql支持数据更新;

5、索引:hive没有索引,因此查询数据的时候是通过mapreduce很暴力的把数据都查询一遍,也造成了hive查询数据速度很慢的原因,而mysql有索引。

相关推荐

hive是什么意思

Hive是一个基于Hadoop的数据仓库工具,用于处理大型分布式数据集,允许用户使用类似于SQL的语言来管理和查询数据。1.概述Hive是一个数据仓库工具,可以将数据存储在Hadoop文件系统中,并使用SQL风格的查询语言对这些数据进行操作。它可以轻松地处理结构化、半结构化和非结构化数据。Hive使用类似于SQL的语言来查询数据,这使得对于熟悉SQL的开发人员而言非常容易上手。2.架构Hive的架构有三层:用户界面、驱动程序和执行引擎。用户界面负责接受HiveQL语句,驱动程序将这些语句转换为MapReduce任务,并将执行结果返回给用户界面。执行引擎是MapReduce框架,它执行对数据的实际查询。在Hive的架构中,还包括Metastore和Hive Server。Metastore维护着关于表、分区和表的元数据信息(如字段名称、类型、分区信息等),而Hive Server则负责进程间通信。3.数据类型Hive支持大多数SQL标准数据类型,例如字符串、整型、浮点型等。此外,Hive还有一些自定义的数据类型如ARRAY、MAP和STRUCT。4.HiveQLHive的查询语言被称为HiveQL,它是类似于SQL的查询语言,支持大多数SQL标准的查询语句。HiveQL还支持自定义函数和用户定义聚合函数,这有助于进行高级数据处理。5.Hive与Hadoop生态系统Hive紧密集成了Hadoop的生态系统,可以轻松地将其与其他工具集成使用。例如,Hive可以通过Sqoop来将关系数据库中的数据导入到Hadoop中,也可以通过HBase来查询实时数据。
2023-07-21 01:13:521

Hive 是什么意思?

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
2023-07-21 01:14:191

hive提供的是什么服务

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。简介hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容。这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言查询、汇总和分析数据。而mapreduce开发人员可以把自己写的mapper和reducer作为插件来支持hive做更复杂的数据分析。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。它还提供了一系列的工具进行数据提取转化加载,用来存储、查询和分析存储在Hadoop中的大规模数据集,并支持UDF(User-Defined Function)、UDAF(User-Defined AggregateFunction)和UDTF(User-Defined Table-Generating Function),也可以实现对map和reduce函数的定制,为数据操作提供了良好的伸缩性和可扩展性。
2023-07-21 01:14:591

hive什么意思hive怎么读

1、hive蜂巢,读音:美/ha_v/;英/ha_v/。2、释义:n.蜂巢,蜂箱;蜂群;(喻)充满繁忙人群的场所。v.使(蜜蜂)进入蜂箱;存贮,积累;群居,生活在蜂房中。3、例句:Ahiveiswherethebeeslive.蜂巢是蜜蜂生活的地方
2023-07-21 01:15:131

Hive精华问答 | Hive的数据模型是怎样的?

Hive是一个数据仓库基础工具,它是建立在Hadoop之上的数据仓库,在某种程度上可以把它看做用户编程接口(API),本身也并不存储和处理数据,依赖于HDFS存储数据,依赖MR处理数据。它提供了一系列对数据进行提取、转换、加载的工具。依赖于HDFS存储数据,依赖MR处理数据。 1 Q:Hive是什么? A: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本质是将HQL转换为MapReduce程序。 2 Q:Hive的设计目标是什么? A: 1、Hive的设计目标是使Hadoop上的数据操作与传统SQL相结合,让熟悉SQL编程开发人员能够轻松向Hadoop平台迁移 2、Hive提供类似SQL的查询语言HQL,HQL在底层被转换为相应的MapReduce操作 3、Hive在HDFS上构建数据仓库来存储结构化的数据,这些数据一般来源与HDFS上的原始数据,使用Hive可以对这些数据执行查询、分析等操作。 3 Q:Hive的数据模型是怎样的? A: Hive数据库 内部表 外部表 分区 桶 Hive的视图 Hive在创建内部表时,会将数据移动到数据仓库指向的路径,若创建外部表,仅记录数据所在的路径,不对数据位置做任何改变,在删除表的时候,内部表的元数据和数据会被一起删除,外部表只会删除元数据,不删除数据。这样来说,外部表要比内部表安全,数据组织液更加灵活,方便共享源数据。 4 Q:Hive都有哪些调用方式? A : 1、Hive Shell 2、Thrift 3、JDBC 4、ODBC 5 Q:Hive的运行机制是什么? A: 1、将sql转换成抽象语法树 2、将抽象语法树转化成查询块 3、将查询块转换成逻辑查询计划(操作符树) 4、将逻辑计划转换成物理计划(MRjobs) 福利 扫描添加我 微信 ,备注“ 姓名+公司职位 ”,加入【 云计算学习交流群 】,和志同道合的朋友们共同打卡学习!
2023-07-21 01:15:201

“hive”这个词语是什么意思?

hiven. 蜂巢; 蜂箱; 蜂群; 喧闹地区; vt. 使(蜂)入蜂箱; 贮(蜜)于蜂箱中; 储备,积累;hivesn. 蜂巢; 蜂群; <医>荨麻疹; 蜂箱( hive的名词复数 ); 喧闹地区; v. 使(蜂)入hivern. 养蜂人; 招蜂器;Hives [人名] 海夫斯;hive off (蜜蜂)分群;
2023-07-21 01:15:281

hive的设计特征

Hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL 的HiveQL 语言实现数据查询,所有Hive 的数据都存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)中。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。● 支持索引,加快数据查询。● 不同的存储类型,例如,纯文本文件、HBase 中的文件。● 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。● 可以直接使用存储在Hadoop 文件系统中的数据。● 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。● 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
2023-07-21 01:15:361

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)使用MapReduce作为计算;Hive应用场景数据源:1)文件数据,如中国移动某设备每天产生大量固定格式的文件;2)数据库以上两种不同的数据源有个共同点:要使用hive,那么必须要将数据放到hive中;通常采用如下两种方式:1)文件数据:load到hive2)数据库: sqoop到hive数据的离线处理;hive的执行延迟比较高,因为hive常用于数据分析的,对实时性要求不高;hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。处理数据存放在hive表中,那么前台系统怎么去访问hive的数据呢?先将hive的处理结果数据转移到关系型数据库中才可以,sqoop就是执行导入导出的操作
2023-07-21 01:15:501

hive 什么意思?

n.蜂房 蜂巢 热闹的场所
2023-07-21 01:16:096

hadoop和hive之间有什么关系?

hive是hadoop的延申。hadoop是一个分布式的软件处理框架,hive是一个提供了查询功能的数据仓库,而hadoop底层的hdfs为hive提供了数据存储。hive将用户提交的SQL解析成mapreduce任务供hadoop直接运行,结合两者的优势,进行数据决策。一个擅长大数据并行计算,一个支持SQL数据查询,方便是显而易见的。但hive只要还是读操作有了Hive之后,人们发现SQL对比Java有巨大的优势。一个是它太容易写了。刚才词频的东西,用SQL描述就只有一两MapReduce写起来大约要几十上百行。扩展资料:它主要有以下几个优点 :1、高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖 。2、高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中 。3、高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。4、高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++ 。
2023-07-21 01:16:241

程序中的Hive具体是干什么用的呢?

Hive是基于Hadoop平台的数仓工具,具有海量数据存储、水平可扩展、离线批量处理的优点,解决了传统关系型数仓不能支持海量数据存储、水平可扩展性差等问题,但是由于Hive数据存储和数据处理是依赖于HDFS和MapReduce,因此在Hive进行数据离线批量处理时,需将查询语言先转换成MR任务,由MR批量处理返回结果,所以Hive没法满足数据实时查询分析的需求。Hive是由FaceBook研发并开源,当时FaceBook使用Oracle作为数仓,由于数据量越来越大,Oracle数仓性能越来越差,没法实现海量数据的离线批量分析,因此基于Hadoop研发Hive,并开源给Apacha。由于Hive不能实现数据实时查询交互,Hbase可提供实时在线查询能力,因此Hive和Hbase形成了良性互补。Hbase因为其海量数据存储、水平扩展、批量数据处理等优点,也得到了广泛应用。Pig与HIVE工具类似,都可以用类sql语言对数据进行处理。但是他们应用场景有区别,Pig用于数据仓库数据的ETL,HIVE用于数仓数据分析。从架构图当中,可看出Hive并没有完成数据的存储和处理,它是由HDFS完成数据存储,MR完成数据处理,其只是提供了用户查询语言的能力。Hive支持类sql语言,这种SQL称为Hivesql。用户可用Hivesql语言查询,其驱动可将Hivesql语言转换成MR任务,完成数据处理。【Hive的访问接口】CLI:是hive提供的命令行工具HWI:是Hive的web访问接口JDBC/ODBC:是两种的标准的应用程序编程访问接口Thrift Server:提供异构语言,进行远程RPC调用Hive的能力。因此Hiv具备丰富的访问接口能力,几乎能满足各种开发应用场景需求。【Driver】是HIVE比较核心的驱动模块,包含编译器、优化器、执行器,职责为把用户输入的Hivesql转换成MR数据处理任务【Metastore】是HIVE的元数据存储模块,数据的访问和查找,必须要先访问元数据。Hive中的元数据一般使用单独的关系型数据库存储,常用的是Mysql,为了确保高可用,Mysql元数据库还需主备部署。架构图上面Karmasphere、Hue、Qubole也是访问HIVE的工具,其中Qubole可远程访问HIVE,相当于HIVE作为一种公有云服务,用户可通过互联网访问Hive服务。Hive在使用过程中出现了一些不稳定问题,由此发展出了Hive HA机制,
2023-07-21 01:16:391

如何查看hive版本?

可以通过以下方法查看hive版本:1. 查看hive加载的jar方式来查看。2. 进入hive/lib目录下查看hive-exec的jar包版本。通常,hive-exec的那个jar包的版本就是hive的版本号。
2023-07-21 01:16:473

hadoop和hive之间有什么关系?

hive是建立在hadoop之上的一个工具,用于简化一些BI统计。Hive能够帮助用户屏蔽掉复杂的mapreduce逻辑,而只需用户使用简单sql即可完成一定的查询功能
2023-07-21 01:17:035

大数据之-HIVE入门(十四)

当join时有一个或多个小表可以装载进内存时可以使用mapjoin完成。 第一种方法是可以加上mapjoin指示 第二种方法是设置 set hive.auto.convert.join=true;来让hive自动优化。同时可以指定 set hive.auto.convert.join.noconditionaltask = true; --默认开启 set hive.auto.convert.join.noconditionaltask.size = 10000000; --默认10M,可以根据需求做调整。 hive.mapjoin.smalltable.filesize= 2500000;--早期hive版本小表文件大小设置默认25M。 当数据量比较大启动mapjoin后会造成问题请关闭 set hive.map.aggr = true; //是否在 Map 端进行聚合,默认为 True ; set hive.groupby.mapaggr.checkinterval = 100000000; //在 Map 端进行聚合操作的条目数目 1、在关联操作前尽量减小数据集,能先聚合的先聚合、能过滤的先过滤(如设置查询条件、合理设置分区,有分区必须设置分区范围)。 2、关联时数据类型要做到一致,如果不一致请用cast先转换类型。 3、慎用count(distinct) ,容易产生数据倾斜,可以先group by 再count。 4、减少小文件,合理设置输入文件大小、合理设置map job 、reduce job数。 set hive.merge.mapredfiles=true;--设置合并map文件标识。 set mapred.max.split.size=100000000; --设置最大输入文件大小,大于此数值都会进行拆分。 set mapred.min.split.size.per.node=100000000;--设置每个节点可处理的最小值。 set mapred.min.split.size.per.rack=100000000;--设置每个机架可处理的最小值。 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; – 执行前进行小文件合并。 set mapred.reduce.tasks=10; -- 设置reduce的数量 set hive.exec.reducers.bytes.per.reducer=1073741824 --设置每个reduce所处理的数据大小 5、选取字段避免用select * ,只引用你要用的字段,如select a.uid,a.price。 6、关联值有null值的情况下,可以将null值过滤出来单独处理或者将null值随机赋值。当存在某key有热点问题,也可以同样处理。 7、合理设置数据模型、文件存储格式有利于查询效率优化。 8、善用union all 合并对于同一个表的查询,有利于整体提高效率。 9、合理使用中间临时表,数据量巨大时,如统计一年的数据,可先小规模聚合如按月聚合生成中间表,最后再合并统计出结果。 10、有order by 要限制输出条数。 11、合理设置并行查询 set hive.exec.parallel= true ; --以开启并发执行。 set hive.exec.parallel.thread.number= 10 ; //同一个sql允许最大并行度,默认为8。
2023-07-21 01:17:381

hive查询数据一直卡住,最后报错

然后删除NEXT_LOCK_ID一条记录。NEXT_LOCK_ID 始终有锁,无法删除数据。;1、停止hiveserver2,MetaStore 服务;发现还有锁;2、查看hive应用进程 ps -ef|grep hive,全部杀掉,锁释放;3、然后删除NEXT_LOCK_ID一条记录;4、重启hiveserver2,MetaStore;5、查询hive 恢复正常。原因可能是多个进程同时操作,导致hive事务上的bug,插进了2条一样的数据,导致元数据库被锁以下几个hive元数据表跟hive的事务有关:NEXT_LOCK_ID;next_compaction_queue_id;next_txn_id;以上三个表出问题就有可能会报以下错误: error in acquiring locks: error communicating with the metastore.hive 卡死的原因很多,这个是其中之一,基本都hive metastore会有一些关系,大家可以按这个方向去定位原因,就能更快速寻找到问题的根源。
2023-07-21 01:17:451

hive能存储数据吗

1、首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。2、第hive本身是不存储数据的,不论外表、内表,hive的所有数据是存放在hdfs文件系统的。3、hadoop是一个分布式的软件处理框架,hive是一个提供了查询功能的数据仓库,而hadoop底层的hdfs为hive提供了数据存储。hive将用户提交的SQL解析成mapreduce任务供hadoop直接运行,结合两者的优势,进行数据决策。4、国内最常用的是一款基于Hadoop的开源数据仓库,名为Hive,它可以对存储在HDFS的文件数据进行查询、分析。Hive对外可以提供HiveQL,这是类似于SQL语言的一种查询语言。5、Pig与HIVE工具类似,都可以用类sql语言对数据进行处理。但是他们应用场景有区别,Pig用于数据仓库数据的ETL,HIVE用于数仓数据分析。
2023-07-21 01:18:111

Hive最终都会转化成什么程序来执行?

下单备注:奶牛睡衣
2023-07-21 01:18:206

Hadoop,Hive,Spark 之间是什么关系

Spark已经取代Hadoop成为最活跃的开源大数据项目,但是,在选择大数据框架时,企业不能因此就厚此薄彼近日,著名大数据专家Bernard Marr在一篇文章中分析了Spark和 Hadoop 的异同Hadoop和Spark均是大数据框架,都提供了一些执行常见大数据任务的工具,但确切地说,它们所执行的任务并不相同,彼此也并不排斥虽然在特定的情况下,Spark据称要比Hadoop快100倍,但它本身没有一个分布式存储系统而分布式存储是如今许多大数据项目的基础,它可以将 PB 级的数据集存储在几乎无限数量的普通计算机的硬盘上,并提供了良好的可扩展性,只需要随着数据集的增大增加硬盘因此,Spark需要一个第三方的分布式存储,也正是因为这个原因,许多大数据项目都将Spark安装在Hadoop之上,这样,Spark的高级分析应用程序就可以使用存储在HDFS中的数据了与Hadoop相比,Spark真正的优势在于速度,Spark的大部分操作都是在内存中,而Hadoop的MapReduce系统会在每次操作之后将所有数据写回到物理存储介质上,这是为了确保在出现问题时能够完全恢复,但Spark的弹性分布式数据存储也能实现这一点另外,在高级数据处理(如实时流处理、机器学习)方面,Spark的功能要胜过Hadoop在Bernard看来,这一点连同其速度优势是Spark越来越受欢迎的真正原因实时处理意味着可以在数据捕获的瞬间将其提交给分析型应用程序,并立即获得反馈在各种各样的大数据应用程序中,这种处理的用途越来越多,比如,零售商使用的推荐引擎、制造业中的工业机械性能监控Spark平台的速度和流数据处理能力也非常适合机器学习算法,这类算法可以自我学习和改进,直到找到问题的理想解决方案这种技术是最先进制造系统(如预测零件何时损坏)和无人驾驶汽车的核心Spark有自己的机器学习库MLib,而Hadoop系统则需要借助第三方机器学习库,如Apache Mahout实际上,虽然Spark和Hadoop存在一些功能上的重叠,但它们都不是商业产品,并不存在真正的竞争关系,而通过为这类免费系统提供技术支持赢利的公司往往同时提供两种服务例如,Cloudera 就既提供 Spark服务也提供 Hadoop服务,并会根据客户的需要提供最合适的建议Bernard认为,虽然Spark发展迅速,但它尚处于起步阶段,安全和技术支持基础设施方还不发达,在他看来,Spark在开源社区活跃度的上升,表明企业用户正在寻找已存储数据的创新用法
2023-07-21 01:19:032

hbase和hive的差别是什么,各自适用在什么场景中

对于hbase当前noSql数据库的一种,最常见的应用场景就是采集的网页数据的存储,由于是key-value型数据库,可以再扩展到各种key-value应用场景,如日志信息的存储,对于内容信息不需要完全结构化出来的类CMS应用等。注意hbase针对的仍然是OLTP应用为主。对于hive主要针对的是OLAP应用,注意其底层不是hbase,而是hdfs分布式文件系统,重点是基于一个统一的查询分析层,支撑OLAP应用中的各种关联,分组,聚合类SQL语句。hive一般只用于查询分析统计,而不能是常见的CUD操作,要知道HIVE是需要从已有的数据库或日志进行同步最终入到hdfs文件系统中,当前要做到增量实时同步都相当困难。和mysql,oracle完全不是相同的应用场景。这个是结构化数据库,针对的更多的是结构化,事务一致性要求高,业务规则逻辑复杂,数据模型复杂的企业信息化类应用等。包括互联网应用中的很多业务系统也需要通过结构化数据库来实现。所以和hbase,hive不是一个层面的东西,不比较。
2023-07-21 01:19:101

怎么设置hive中map 个数

控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);2. 举例: a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。3. 是不是map数越多越好? 答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。4. 是不是保证每个map处理接近128m的文件块,就高枕无忧了? 答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。针对上面的问题3和4,我们需要采取两种方式来解决:即减少map数和增加map数;如何合并小文件,减少map数?假设一个SQL任务:Select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04";该任务的inputdir /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04共有194个文件,其中很多是远远小于128m的小文件,总大小9G,正常执行会用194个map任务。Map总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020我通过以下方法来在map执行前合并小文件,减少map数:set mapred.max.split.size=100000000;set mapred.min.split.size.per.node=100000000;set mapred.min.split.size.per.rack=100000000;set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;再执行上面的语句,用了74个map任务,map消耗的计算资源:SLOTS_MILLIS_MAPS= 333,500对于这个简单SQL任务,执行时间上可能差不多,但节省了一半的计算资源。大概解释一下,100000000表示100M, set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并,最终生成了74个块。如何适当的增加map数? 当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。假设有这样一个任务:Select data_desc,count(1),count(distinct id),sum(case when …),sum(case when ...),sum(…)from a group by data_desc如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。set mapred.reduce.tasks=10;create table a_1 asselect * from adistribute by rand(123);这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方,根据实际情况,控制map数量需要遵循两个原则:使大数据量利用合适的map数;使单个map任务处理合适的数据量;
2023-07-21 01:19:181

hive怎么实现update操作

数据更新是一种常见的操作,然后数据仓库的概念一般要求的是数据是集成、稳定的。HIVE作为一种分布式环境下以HDFS为支撑的数据仓库,它同样更多的要求数据是不可变的。然而现实很多任务中,往往需要对数据进行更新操作,经查,Hive自0.11版本之后就提供了更新操作。于是想着试验一下,看看HIVE更新的操作和性能。按照网上办法进行设置.hive.support.concurrency–truehive.enforce.bucketing–true(NotrequiredasofHive2.0)hive.exec.dynamic.partition.mode–nonstricthive.txn.manager–org.apache.Hadoop.hive.ql.lockmgr.DbTxnManagerhive.compactor.initiator.on–true(forexactlyoneinstanceoftheThriftmetastoreservice)hive.compactor.worker.threads–apositive 同样在建表后面添加: storedasorcTBLPROPERTIES("transactional"="true");以支持ACID的要求.如以简单的表进行实验:(idint,namestring),随意导入几条数据,进行测试.写入更新操作命令:update**setname="aaa"whereid=1;得到结果如下:似乎这样操作,HIVE对UPDATE操作就非常好的。其实经过实验,发现HIVE的更新机制速度非常的慢,在一个仅仅为6行的数据测试,其花费时间也要180S,这种效率肯定是无法忍受的。猜测其原因可能需要读出原有的表,进行更新,然后再写回HDFS?仅仅是猜测而已。另外一个非常头疼的事情是,这种HIVE环境下支持ACID的表,竟然只能在HIVE内部才能访问到,而在BEELINE或者Spark环境下,居然是无法获得数据的。或者对外不提供接口。(中间那行居然不显示数据!!!!)
2023-07-21 01:19:382

hbase和hive的差别是什么,各自适用在什么场景中

对于hbase当前noSql数据库的一种,最常见的应用场景就是采集的网页数据的存储,由于是key-value型数据库,可以再扩展到各种key-value应用场景,如日志信息的存储,对于内容信息不需要完全结构化出来的类CMS应用等。注意hbase针对的仍然是OLTP应用为主。对于hive主要针对的是OLAP应用,注意其底层不是hbase,而是hdfs分布式文件系统,重点是基于一个统一的查询分析层,支撑OLAP应用中的各种关联,分组,聚合类SQL语句。hive一般只用于查询分析统计,而不能是常见的CUD操作,要知道HIVE是需要从已有的数据库或日志进行同步最终入到hdfs文件系统中,当前要做到增量实时同步都相当困难。和mysql,oracle完全不是相同的应用场景。这个是结构化数据库,针对的更多的是结构化,事务一致性要求高,业务规则逻辑复杂,数据模型复杂的企业信息化类应用等。包括互联网应用中的很多业务系统也需要通过结构化数据库来实现。所以和hbase,hive不是一个层面的东西,不比较。
2023-07-21 01:19:461

Hive 数据库表的基本操作,必须掌握的基本功

说明:hive 的表存放位置模式是由 hive-site.xml 当中的一个属性指定的,默认是存放在该配置文件设置的路径下,也可在创建数据库时单独指定存储路径。 数据库有一些描述性的属性信息,可以在创建时添加: 查看数据库的键值对信息 修改数据库的键值对信息 与mysql查询语句是一样的语法 删除一个空数据库,如果数据库下面有数据表,那么就会报错 强制删除数据库,包含数据库下面的表一起删除(请谨慎操作) []里的属性为可选属性,不是必须的,但是如果有可选属性,会使 sql 语句的易读性更好,更标准与规范。 例如:[comment "字段注释信息"][comment "表的描述信息"]等,[external]属性除外 1. CREATE TABLE 创建一个指定名字的表,如果相同名字的表已存在,则抛出异常提示:表已存在,使用时可以使用IF NOT EXISTS语句来忽略这个异常。 如果创建的表名已存在,则不会再创建,也不会抛出异常提示:表已存在。否则则自动创建该表。 2. EXTERNAL 顾名思义是外部的意思,此关键字在建表语句中让使用者可以创建一个外部表,如果不加该关键字,则默认创建内部表。 外部表在创建时必须同时指定一个指向实际数据的路径(LOCATION),Hive在创建内部表时,会将数据移动到数据仓库指向的路径; 若创建外部表,仅记录数据所在的路径,不对数据的位置作任何改变。 内部表在删除后,其元数据和数据都会被一起删除。 外部表在删除后,只删除其元数据,数据不会被删除。 3. COMMENT 用于给表的各个字段或整张表的内容作解释说明的,便于他人理解其含义。 4. PARTITIONED BY 区分表是否是分区表的关键字段,依据具体字段名和类型来决定表的分区字段。 5. CLUSTERED BY 依据column_name对表进行分桶,在 Hive 中对于每一张表或分区,Hive 可以通过分桶的方式将数据以更细粒度进行数据范围划分。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。 6. SORTED BY 指定表数据的排序字段和排序规则,是正序还是倒序排列。 7. ROW FORMAT DELIMITED FIELDS TERMINATED BY " " 指定表存储中列的分隔符,这里指定的是" ",也可以是其他分隔符。 8. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE 指定表的存储格式,如果文件数据是纯文本格式,可以使用STORED AS TEXTFILE,如果数据需要压缩,则可以使用STORED AS SEQUENCEFILE。 9. LOCATION 指定 Hive 表在 hdfs 里的存储路径,一般内部表(Managed Table)不需要自定义,使用配置文件中设置的路径即可。 如果创建的是一张外部表,则需要单独指定一个路径。 1. 使用create table语句创建表 例子: 2. 使用create table ... as select...语句创建表 例子: 使用 create table ... as select ...语句来创建新表sub_student,此时sub_student 表的结构及表数据与 t_student 表一模一样, 相当于直接将 t_student 的表结构和表数据复制一份到 sub_student 表。 注意: (1). select 中选取的列名(如果是 * 则表示选取所有列名)会作为新表 sub_student 的列名。 (2). 该种创建表的方式会改变表的属性以及结构,例如不能是外部表,只能是内部表,也不支持分区、分桶。 如果as select后的表是分区表,并且使用select *,则分区字段在新表里只是作为字段存在,而不是作为分区字段存在。 在使用该种方式创建时,create 与 table 之间不能加 external 关键字,即不能通过该种方式创建外部目标表,默认只支持创建内部目标表。 (3). 该种创建表的方式所创建的目标表存储格式会变成默认的格式textfile。 3.使用like语句创建表 例子: 注意: (1). 只是将 t_student 的表结构复制给 sub1_student 表。 (2). 并不复制 t_student 表的数据给 sub1_student 表。 (3). 目标表可以创建为外部表,即:
2023-07-21 01:20:061

hive中的字符串提取

u2003u2003在进行数据分析时,尤其要对网页进行分析时,我们往往要对其中部分的数据进行抽取,这个就需要靠hive的函数来完成了。 u2003u2003首先要讲的是split函数,这个函数的作用是对字符窜进行分割,基本用法为:split(string str, string pat) ,返回值为一个数组array,因此要取值得话需要用到切片,即[数字],其中第一个str是要切分的字符串,第二个pat是以什么字符进行切割。来看案例吧。 u2003u2003有的时候切割不是一下就能完成,那么就多去嵌套几次split就好了。 u2003u2003返回字符串从某个位置开始固定长度的子串,和substring功能相同,基本用法为substr(string A, int start, int len ),还是来看例子。值得注意的是,substr(str,0,2)和substr(str,1,2)的功能都是一样的,都是从第一个位置开始。 u2003u2003这个函数是个神器,可以解析url结构,返回我们想要的东西。基本用法为parse_url(string urlString, string partToExtract [, string keyToExtract]),其中partToExtract的有效值包括HOST,PATH, QUERY, REF, PROTOCOL, AUTHORITY,FILE和USERINFO等,具体我就不一一解释了,大家使用时可以自行百度。重点说一下,当第二个参数是QUERY时,第三个参数就可以使用了,这个是参数提取最有用的方法了,还是以案例来说明。 u2003u2003这个函数是最终的大杀器了,以上都解决不了你的问题的时候,有了这个一切都可以解决,使用这个函数的基础是正则表达式基础要会一些。这个函数的基本用法是regexp_extract(string subject, string pattern, int index),第一个参数是待处理的字符串,第二个参数是写好的正则,第三个表达式一般用不上可以忽略掉。来看例子: u2003u2003有了以上函数,相信应该能满足大家对于hive进行字符串提取的一切要求了。
2023-07-21 01:20:131

在hive数据库中怎么查看表结构

1进入HIVE之前要把HADOOP给启动起来,因为HIVE是基于HADOOP的。所有的MR计算都是在HADOOP上面进行的。2在命令行中输入:hive。这个时候就可以顺利的进入HIVE了。当然了,如果你想直接执行HQL脚本文件可以这样:hive -f xxxxx.hql。3进入hive之后一一般默认的数据库都是default。如果你切换数据库的话所建的表都会是在default数据库里面。4创建数据库的语法是:create database database_name;非常简单的,其实hive跟mysql的语法还是比较相似的。为什么呢?请继续往下5切换数据库的时候可以输入:use database_name;查看所有数据库的时候可以输入:show databases;查看所有表的时候可以输入:show tables6看表结构的时候可以输入:describe tab_name;
2023-07-21 01:20:211

Hive中存放是什么?

Hive中存放表。 存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。
2023-07-21 01:20:351

Hive是什么,Hive与关系型数据库的区别

全不同应用场景吧,HBase速度比Hive快了不知道多少。HBase是非关系型数据库(KV型),对key做索引,查询速度非常快(相比较Hive),适合实时查询;而Hive是关系型数据结构,适合做后期数据分析。和单机的MySQL,Oracle比较的话,Hive的优点是可以存储海量数据,只是查询速度比较慢。
2023-07-21 01:20:441

Hive常用命令

参数说明: EXTERNAL:创建外部表,在建表的同时可以指定源数据的路径(LOCATION),创建内部表时,会将数据移动到数据仓库指向的路径,若创建外部表不会有任何改变。在删除表时,内部表的元数据和源数据都会被删除,外部表不会删除源数据。 COMMENT:为表和列增加注释 PARTITIONED BY:创建分区表, ——PARTITIONED BY(dt STRING, country STRING) CLUSTERED BY:创建分桶表 SORTED BY:创建排序后分桶表(不常用) ——CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS ROW FORMAT DELIMITED:是用来设置创建的表在加载数据的时候,支持的列分隔符。Hive默认的分隔符是01,属于不可见字符,这个字符在vi里是^A —— ROW FORMAT DELIMITED FIELDS TERMINATED BY "01"; STORED AS:指定存储文件类型 sequencefile (二进制序列文件)、textfile(文本)、rcfile(列式存储格式文件)、ORC 如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。 如果数据需要压缩,使用 STORED AS SEQUENCEFILE。 LOCATION:指定表在 hdfs 上的存储位置 注意:若是外部表,则还需要删除文件(hadoop fs -rm -r -f hdfspath) 注意:INPATH后面的文件路径不能和hive表路径在hdfs上一致,最好是两个不同的文件路径,在加载过程中,源路径下的文件会被移动到hive表所在路径下,如果一致,会找不到文件错误; Hive支持内置和自定义开发的文件格式。以下是Hive内置的一些格式: 默认是文本格式. textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并查询的效率最低,可以直接存储,加载数据的速度最高. sequencefile 存储空间消耗最大,压缩的文件可以分割和合并查询效率高,需要通过text文件转化来加载. rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低. 相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次操作仅针对若干列的情景,列式存储引擎的性价比更高。
2023-07-21 01:20:511

hive基础语法

1:启动集群中所有的组件 cd /export/onekey ./start-all.sh 2:使用终端连接Hive 3:打开 beeline 前先输入以下命令 :star2: 在大数据中,最常用的一种思想就是分治,分区表实际就是对应hdfs文件系统上的的独立的文件夹,该文件夹下是 该分区所有数据文件。 :star2:分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。 :star2:Hive中可以创建一级分区表,也可以创建多级分区表 :star2:根据内外部表可区分出==分区内部表==、==分区外部表== 1.创建分区表 2.加载数据 1.可见分区字段会显示在表中,但是它并不是真实存在于表的字段 2.加载同一等级不同分区的数据 3.这时可以指定分区字段值当作筛选条件【分区表和where联动】 1.创建多级分区表 2.加载数据 1.加载同一等级不同分区的数据 2.指定分区字段值当作筛选条件【分区表和where联动】 定义 :Array是数组类型,Array中存放相同类型的数据。 语法: concat_ws(string SEP, string A, string B…) 说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符 举例: 语法: substr(string A, int start, int len), --start是顺序 substring(string A, int start, int len) -- start可以是逆序【即负数】 返回值: string 说明:返回字符串A从start位置开始,长度为len的字符串 举例: 语法: year(string date) 说明:返回日期中的年。 举例: 语法: date_add(string startdate, int days) 说明:返回开始日期startdate增加days天后的日期。 举例: 语法: date_sub (string startdate, int days) 返回值: string 说明:返回开始日期startdate减少days天后的日期。 举例: 行转列是指多行数据转换为一个列的字段。 Hive行转列用到的函数: concat_ws(sep, str1,str2) --以分隔符拼接每个字符串 collect_set(col) --将某字段的值进行去重汇总,产生array类型字段 示例: 生产中只用rank和dense_rank,row_number不合理 rank() 输出的排名 (1,2,3,3,5) dense_rank() 输出的排名 (1,2,3,3,4) 示例: 用于== 实现分组内所有和连续累积的统计 == Apache Zeppelin是一款基于Web交互式框架,支持多种语言,提供了== 数据分析 ==、 ==数据可视化== 功能。 使用Zeppelin来连接到Spark SQL的Thrift Server,可以以更直观的方式来查看Hive中的数据。而且Zeppelin也可以以图表的方式展示数据。 使用Zeppelin来连接到Spark SQL的Thrift Server的好处有两个: 1.原始日志数据会存放在临时存储层ODS层 2.预处理数据会放在数据仓库DW层 3.分析得到的结果数据放在应用层APP层 case有两种写法,但是只用记住第二种写法 case when then end :star: 解决办法来自: https://community.cloudera.com/t5/Support-Questions/hive-date-time-problem/td-p/139953 解决办法是,弃用date_format(),改用 == from_unixtime(unix_timestamp(b,"yyyy-MM-dd HH:mm")) == 适用于得出单独的年月日,比如hour(date_format(b,"yyyy-MM-dd")) 、year(date_format(b,"yyyy-MM-dd"))、month(date_format(b,"yyyy-MM-dd")) 不适用于时分秒函数内 适用于所有日期的情况,无论是年月日时分秒,在规整时间后就可以得到年月日时分秒
2023-07-21 01:20:591

hive的元数据存储在derby和mysql中有什么区别(hive和mysql的区别通俗易懂)

hive的元数据如果放在derby,一般只能允许1个会话连接;而mysql则没有这个限制;为了共享知识,请点个赞支持下
2023-07-21 01:21:061

hive的介绍

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
2023-07-21 01:21:551

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)使用MapReduce作为计算;Hive应用场景数据源:1)文件数据,如中国移动某设备每天产生大量固定格式的文件;2)数据库以上两种不同的数据源有个共同点:要使用hive,那么必须要将数据放到hive中;通常采用如下两种方式:1)文件数据:load到hive2)数据库:sqoop到hive数据的离线处理;hive的执行延迟比较高,因为hive常用于数据分析的,对实时性要求不高;hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。处理数据存放在hive表中,那么前台系统怎么去访问hive的数据呢?先将hive的处理结果数据转移到关系型数据库中才可以,sqoop就是执行导入导出的操作
2023-07-21 01:22:231

Hive 分区字段限制

hivesql分区字段不可以有中文,否则会报错如下: Failed with exception MetaException(message:javax.jdo.JDOException: Exception thrown when executing query : SELECT DISTINCT "org.apache.hadoop.hive.metastore.model.MPartition" AS NUCLEUS_TYPE , A0 . CREATE_TIME , A0 . LAST_ACCESS_TIME , A0 . PART_NAME , A0 . PART_ID FROM PARTITIONS A0 LEFT OUTER JOIN TBLS B0 ON A0 . TBL_ID = B0 . TBL_ID LEFT OUTER JOIN DBS C0 ON B0 . DB_ID = C0 . DB_ID WHERE B0 . TBL_NAME = ? AND C0 . NAME = ? AND A0 . PART_NAME = ? at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:677) at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:388) at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:252) at org.apache.hadoop.hive.metastore.ObjectStore.getMPartition(ObjectStore.java:1607) at org.apache.hadoop.hive.metastore.ObjectStore.getPartitionWithAuth(ObjectStore.java:1875) at org.apache.hadoop.hive.metastore.ObjectStoreWithBIMapping.getPartitionWithAuth(ObjectStoreWithBIMapping.java:341) at org.apache.sentry.binding.hive.v2.metastore.AuthorizingObjectStoreV2WithBIMapping.getPartitionWithAuth(AuthorizingObjectStoreV2WithBIMapping.java:218) at org.apache.sentry.binding.hive.v2.metastore.MTAuthorizingObjectStoreV2WithBIMapping.getPartitionWithAuth(MTAuthorizingObjectStoreV2WithBIMapping.java:231) at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:114) at com.sun.proxy.$Proxy11.getPartitionWithAuth(Unknown Source) at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.get_partition_with_auth(HiveMetaStore.java:3311) at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:107) at com.sun.proxy.$Proxy13.get_partition_with_auth(Unknown Source) at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.hive.metastore.HiveMetaStore$MetricHMSProxy.invoke(HiveMetaStore.java:6752) at com.sun.proxy.$Proxy13.get_partition_with_auth(Unknown Source) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$get_partition_with_auth.getResult(ThriftHiveMetastore.java:9950) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Processor$get_partition_with_auth.getResult(ThriftHiveMetastore.java:9934) at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39) at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39) at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingProcessor$1.run(HadoopThriftAuthBridge.java:747) at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingProcessor$1.run(HadoopThriftAuthBridge.java:742) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1690) at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge$Server$TUGIAssumingProcessor.process(HadoopThriftAuthBridge.java:742) at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) NestedThrowablesStackTrace: java.sql.SQLException: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation "=" at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
2023-07-21 01:22:301

hive能存储数据吗

1、首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。2、第hive本身是不存储数据的,不论外表、内表,hive的所有数据是存放在hdfs文件系统的。3、hadoop是一个分布式的软件处理框架,hive是一个提供了查询功能的数据仓库,而hadoop底层的hdfs为hive提供了数据存储。hive将用户提交的SQL解析成mapreduce任务供hadoop直接运行,结合两者的优势,进行数据决策。4、国内最常用的是一款基于Hadoop的开源数据仓库,名为Hive,它可以对存储在HDFS的文件数据进行查询、分析。Hive对外可以提供HiveQL,这是类似于SQL语言的一种查询语言。5、Pig与HIVE工具类似,都可以用类sql语言对数据进行处理。但是他们应用场景有区别,Pig用于数据仓库数据的ETL,HIVE用于数仓数据分析。
2023-07-21 01:23:051

Hive解析Json数据

HIVE直接读入json的函数有两个: (1)get_json_object(string json_string, string path) 返回值: string 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。 举例: hive> select get_json_object(‘{“store”:{“fruit”:[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], “bicycle”:{“price”:19.95,”color”:”red”}}, “email”:”amy@only_for_json_udf_ test.net ”, “owner”:”amy” } ‘,"$.owner") from dual; 结果:amy 这个函数每次只能返回一个数据项。 (2)json_tuple(jsonStr, k1, k2, ...) 参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object 高效,因为可以在一次调用中输入多个键 select a.timestamp, b.* from log a lateral view json_tuple(a.appevent, "eventid", "eventname") b as f1, f2; 处理数据样例: {"GPS_LAT":39.8965125,"GPS_LONG":116.3493225,"GPS_SPEED":20.9993625,"GPS_STATE":"A","GPS_TIME":"2014-01-02 00:00:16","IMEI":"508597","after_oxygen_sensor":132,"air_condion_state":3,"bdoneNo_after_mileage":0,"bdoneNo_zero_mileage":8044,"db_speed":22,"direction_angle":358.2585,"front_oxygen_sensor":64,"instant_fuel":233,"speed":1210,"torque":33,"total_fuel":0} 处理HIVE语句: create table 2014jrtest as select json_tuple(line,"GPS_LAT","GPS_LONG","GPS_SPEED","GPS_STATE","GPS_TIME","IMEI","after_oxygen_sensor","air_condion_state","bdoneNo_after_mileage","bdoneNo_zero_mileage","db_speed","direction_angle","front_oxygen_sensor","instant_fuel","speed","torque","total_fuel") from 2014test;
2023-07-21 01:23:121

hive 里的时间是什么数据类型

HIVE里有两种时间类型:DATE类和TIMESTAMP类DATE类保存形如‘2017-05-0500:00:00.000"这种数据,TIMESTAMP保存的是一个10位的整数,即UNIX系统下的时间戳记法。可以通过from_unixtime()和unix_timestamp()函数互相转换。当然你也可以直接存成string格式。
2023-07-21 01:24:011

如何通俗地理解Hive的工作原理

Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。流程大致步骤为:1. 用户提交查询等任务给Driver。2. 编译器获得该用户的任务Plan。3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。5. 将最终的计划提交给Driver。6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。7. 获取执行的结果。8. 取得并返回执行结果。
2023-07-21 01:24:211

如何进行hive优化

1.fetch抓取一些HQL语句,可以不翻译为MR程序,而是使用FetchTask来运行,拉取数据!启用了fetch抓取,可以节省某些HQL语句的查询效率!默认fetch抓取的设置是开启的,为morehive.fetch.task.conversion=more2.表的Join2.1表Join的顺序在hive中,不管是 大表 join 小表还是 小表 Join 大表,hive都可以自动优化!2.2 大表之间的Join在MR中ReduceJoin的原理:Map阶段①ReduceTask可以启动任意数量,必须保证关联字段相同的分到同一个区关联字段相同的数据,才能分到同一个ReduceTask②数据源有两种不同类型的文件,都使用同一个map处理逻辑!因此在map()需要根据切片的来源,进行判断,从而进行不同的封装逻辑的选择!③Mapper中封装数据的bean,应该可以覆盖不同类型文件中的所有字段④需要在bean中打标记,标记bean封装的是哪个文件中的数据只需要将order.txt中的数据进行替换后输出!Reduce阶段⑤在reduce()中,根据数据的标记进行分类分为order.txt中的数据和pd.txt中的数据⑥在cleanup()中,只讲order.txt中的数据,替换后写出左外连接,如果左表A表中有大量的c字段的值为null的数据,如果不对null的数据进行过滤,此时会产生数据倾斜!
2023-07-21 01:24:361

Hive是什么,Hive与关系型数据库的区别

全不同应用场景吧,HBase 速度比 Hive 快了不知道多少。HBase 是非关系型数据库(KV型), 对 key 做索引,查询速度非常快(相比较 Hive ),适合实时查询;而Hive是关系型数据结构,适合做后期数据分析。和单机的MySQL,Oracle比较的话,Hive的Hive是什么,Hive与关系型数据库的区别
2023-07-21 01:24:462

hive数据倾斜及处理

火山日常啰嗦 学习了一些大数据的相关框架后,发现应用层的东西确实不难,真正难的都是底层原理,所以我查看了很多资料,借鉴了前人的方法再加上自己的理解,写下了这篇文章。 数据倾斜的直白概念: 数据倾斜就是数据的分布不平衡,某些地方特别多,某些地方又特别少,导致的在处理数据的时候,有些很快就处理完了,而有些又迟迟未能处理完,导致整体任务最终迟迟无法完成,这种现象就是数据倾斜。 针对mapreduce的过程来说就是,有多个reduce,其中有一个或者若干个reduce要处理的数据量特别大,而其他的reduce处理的数据量则比较小,那么这些数据量小的reduce很快就可以完成,而数据量大的则需要很多时间,导致整个任务一直在等它而迟迟无法完成。 跑mr任务时常见的reduce的进度总是卡在99%,这种现象很大可能就是数据倾斜造成的。 产生数据倾斜的原因: 1) key的分布不均匀或者说某些key太集中。 上面就说过,reduce的数据量大小差异过大,而reduce的数据是分区的结果,分区是对key求hash值,根据hash值决定该key被分到某个分区,进而进入到某个reduce,而如果key很集中或者相同,那么计算得到它们的hash值可能一样,那么就会被分配到同一个reduce,就会造成这个reduce所要处理的数据量过大。 2) 业务数据自身的特性。 比如某些业务数据作为key的字段本就很集中,那么结果肯定会导致数据倾斜啊。 还有其他的一些原因,但是,根本原因还是key的分布不均匀,而其他的原因就是会造成key不均匀,进而导致数据倾斜的后果,所以说根本原因是key的分布不均匀。 既然有数据倾斜这种现象,就必须要有数据倾斜对应的处理方案啊。 简单地说数据倾斜这种现象导致的任务迟迟不能完成,耗费了太多时间,极大地影响了性能,所以我们数据倾斜的解决方案设计思路就是往如何提高性能,即如何缩短任务的处理时间这方面考虑的,而要提高性能,就要让key分布相对均衡,所以我们的终极目标就是考虑如何预处理数据才能够使得它的key分布均匀。 常见的数据倾斜处理方案: 1 设置参数 1)设置hive.map.aggr=true //开启map端部分聚合功能,就是将key相同的归到一起,减少数据量,这样就可以相对地减少进入reduce的数据量,在一定程度上可以提高性能,当然,如果数据的减少量微乎其微,那对性能的影响几乎没啥变化。 2)设置hive.groupby.skewindata=true //如果发生了数据倾斜就可以通过它来进行负载均衡。当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照Key 分布到 Reduce 中(这个过程是按照key的hash值进行分区的,不同于mr job1的随机分配,这次可以保证相同的Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。所以它主要就是先通过第一个mr job将key随机分配到reduce,使得会造成数据倾斜的key可能被分配到不同的reduce上,从而达到负载均衡的目的。到第二个mr job中,因为第一个mr job已经在reduce中对这些数据进行了部分聚合(就像单词统计的例子,a这个字母在不同的reduce中,已经算出它在每个reduce中的个数,但是最终的总的个数还没算出来,那么就将它传到第二个mr job,这样就可以得到总的单词个数),所以这里直接进行最后的聚合就可以了。 3)hive.exec.reducers.bytes.per.reducer=1000000000 (单位是字节) 每个reduce能够处理的数据量大小,默认是1G 4)hive.exec.reducers.max=999 最大可以开启的reduce个数,默认是999个 在只配了hive.exec.reducers.bytes.per.reducer以及hive.exec.reducers.max的情况下,实际的reduce个数会根据实际的数据总量/每个reduce处理的数据量来决定。 5)mapred.reduce.tasks=-1 实际运行的reduce个数,默认是-1,可以认为指定,但是如果认为在此指定了,那么就不会通过实际的总数据量/hive.exec.reducers.bytes.per.reducer来决定reduce的个数了。 2 sql语句优化 给几个具体的场景以及在这些场景下的处理方案: 1)进行表的join这种业务操作时,经常会产生数据倾斜。 原因就是这些业务数据本就存在key会分布不均匀的风险,所以我们join时不能使用普通的join(reduce端join)或者可以使用普通join,但是是优化后的。 但是这种操作有个前提条件就是仅适用于小表join大表,而小表怎么定义它的大小,多小的表才算小表,这里有个参数可以确定的(但是这个参数名我暂时忘记了),如果小表的数据大小小于这个值,就可以使用map join,而是在这种情况下是自动使用map join这种方案的。所以如果是大小表join,直接用map join,避免数据倾斜。 方法1:(普通join) select * from log a join users b on (a.user_id is not null and a.user_id = b.user_id ); 这是属于表的内连接的,两张表不满足条件的记录都不保留。 方法2:检测到user_id是null时给它赋予一个新值(这个新值由一个字符串(比如我自己给它定一个 hive)加上一个随机数组成),这样就可以将原来集中的key分散开来,也避免了数据倾斜的风险。而且因为这些数据本来就是无效数据,根本不会出现在结果表中,所以,这样处理user_id(由一个字符串(比如我自己给它定一个 hive)加上一个随机数),它也无法关联的,因为有效的数据的user_id没有这种形式的,所以就算这些无效数据出现在不同的reduce中还是不会影响结果的,我这样处理只是为了将它们分散开而已,所以用这种方法处理,结果表中也不会出现null这些无效数据,跟过滤处理方案得到的结果是一样的。(普通join) select * from log a join users b on case when a.user_id is null then concat(‘hive",rand() ) else a.user_id end = b.user_id; 但是这两种方案只是适用于大表join大表的内连接,两张表的无效数据都不保留。 但是如果对于左外连接或者右外连接这种情况,即使驱动表中某些记录在另一张表中没有数据与它对应,但我们是依然需要保留驱动表的这些数据的,那该怎么办呢?其实很简单,只需要将上述方法得到的结果再与驱动表的这些无数据取并集就可以了。 如下: select * from log a left outer join users b on a.user_id is not null and a.user_id = b.user_id union all select * from log a where a.user_id is null; 2)虽然都是大表,但是呢对于某些业务数据而言,其有用的部分只占它所在表的很少一部分,那么我们就可以将它们先取出来,得到的结果应该是一张小表,那么就可以使用map join来避免数据倾斜了。 场景:用户表中user_id字段为int,log表中user_id字段既有string类型也有int类型。 当按照user_id进行两个表的Join操作时,因为我们在连接时要进行user_id的比较,所以需要user_id的类型都相同,如果我们选择将log表中的String类型转换为int类型,那么就可能会出现这种情况:String类型转换为int类型得到的都是null值(这就是类型转换的问题了,String类型数据转换为int类型会失败,数据丢失,就会赋null值),如果所有的String类型的user_id都变成了null,那么就又出现了集中的key,分区后就又会导致数据倾斜。所以我们进行类型转换时不能选择将String类型转换为int,而应该将int类型转换为String,因为int转换为String不会出问题,int类型原来的值是什么,转换为String后对应的字符串就会是什么,形式没变,只是类型变了而已。 解决方法:把int类型转换成字符串类型 select * from users a join logs b on (a.usr_id = cast(b.user_id as string)); 比如有一份日志,要你从日志中统计某天有多少个用户访问网站,即统计有多少个不同的user_id;但是呢这个网站却又恰巧遭到攻击,日志中大部分都是同一个user_id的记录,其他的user_id属于正常访问,访问量不会很大,在这种情况下,当你直接使用count(distinct user_id)时,这也是要跑mr任务的啊,这时这些大量的相同的user_id就是集中的key了,结果就是通过分区它们都被分到一个reduce中,就会造成这个reduce处理的数据特别大,而其中的reduce处理的数据都很小,所以就会造成数据倾斜。 那么要怎么优化呢? 方法1:可以先找出这个user_id是什么,过滤掉它,然后通过count(distinct user_id)计算出剩余的那些user_id的个数,最后再加1(这1个就是那个被过滤掉的user_id,虽然它有大量的记录,但是ser_id相同的都是同一个用户,而我们要计算的就是用户数) sql语句展示: 分组求和后降序排序,就可以得到这个数据量最大的user_id是什么,然后我们下一步操作时就过滤它,等计算完其他的再加上它这一个。 select user_id,count(user_id) from log group by user_id desc limit 2; select count(distinct user_id)+1 as sum from log; sum就是最终的结果--用户数 方法2:我们可以先通过group by分组,然后再在分组得到的结果的基础之上进行count sql语句展示: select count(*) from (select user_id from log group by user_id) new_log; 总的来说就是,数据倾斜的根源是key分布不均匀,所以应对方案要么是从源头解决(不让数据分区,直接在map端搞定),要么就是在分区时将这些集中却无效的key过滤(清洗)掉,或者是想办法将这些key打乱,让它们进入到不同的reduce中。 性能调优是指通过调整使得机器处理任务的速度更快,所花的时间更少,而数据倾斜的处理是hive性能调优的一部分,通过处理能够大大减少任务的运行时间。 除了数据倾斜的处理之外,hive的优化还有其他方面的,例如where子句优化: select * from a left outer join b on (a.key=b.key) where a.date="2017-07-11" and b.date="2017-07-11"; 这是一个左外连接。 这个sql语句执行的结果是:得到的结果是表a与表b的连接表,且表中的记录的date都是"2017-07-11"。 而这个sql语句的执行过程是:逐条获取到a表的记录,然后扫描b表,寻找字段key值为a.key的记录,找到后将b表的这条记录连接到a表上,然后判断连接后的这条记录是否满足条件a.date="2017-07-11" and b.date="2017-07-11",如果满足,则显示,否则,丢弃。 因为这是一个左外连接,且a为驱动表,连接时在a中发现key而在b中没有发现与之相等的key时,b中的列将置为null,包括列date,一个不为null,一个为null,这样后边的where就没有用了。 简答的说这个方案的做法就是先按连接条件进行连接,连接后再看where条件,如果不满足就丢弃,那之前连接所做的那些功夫就浪费了,白白耗费了资源(cpu等),增加了运行的总时间,如果有一种方案可以在未进行连接之前就直接判断出不满足最终的条件,那么就可以直接丢弃它,这样对于这样的记录就不要浪费资源以及时间去连接了,这样也是能提升性能的,下面就看看这种方案: sql语句: 将刚才的where限制条件直接放到on里面,那么就变成了满足这三个条件才会进行连接,不满足的直接过滤掉,就像上面所说的,少了无效连接那一步,就相对地节约了时间,如果这样的无效连接的记录很多的话,那么采用这种改进版的方案无疑能够较大程度地提高性能。 select * from a left outer join b on (a.key=b.key and a.date="2017-07-11" and b.date="2017-07-11"); 不管怎么说,我们在运行任务时,总是希望能加快运行速度,缩短运行时间,更快地得到结果,即提升性能,这是我们的目的,这就是我们所谓的性能调优。 关于小表join大表的补充: 表join时的操作是这样的: 当操作到驱动表的某条记录时,就会全局扫描另一张表,寻找满足条件的记录,而当扫描它时,为了读取速度更快,一般都选先将它加载到内存,而内存的大小是有限的,为了不占据过多的内存或者避免内存溢出,加载进入内存的表一般是小表,即数据量比较小,map join就是这样做的。 即驱动表不放进内存,而另一张表(即要连接到驱动表的那一张表)就要先加载进内存,为了扫描速度更快,提高性能。 比如select * from a left outer join b on (a.key=b.key); 左外连接,驱动表是a,表b的记录是要被连接到表a的,所以每在a上连接一条记录就要被全局扫描一次的表是b,所以表b应先加载到内存(前提是表b是小表,如果是大表的话,估计会产生oom异常--out of memory内存溢出异常)。 select * from aa right outer join bb on (a.key=b.key); 右外连接,驱动表是bb,aa应先加载到内存(前提是小表)。 ps:希望我的分享能帮助到有需要的伙伴哦。我不是大神的哦,如果文中有误,还请大家不吝赐教,帮忙指正,谢谢了!!!
2023-07-21 01:24:531

已搭建好HADOOP,HIVE,怎么进入并操作数据

[Hadoop@master ~]$ cd $HIVE_HOME --进入Hive目录[hadoop@master hive]$ bin/hive --进入hive环境hive> show databases; 显示已有数据库hive> use test; 使用数据库hive> select * from test_1; 显示表中数据
2023-07-21 01:25:021

如何查看hive日志

Hive中的日志分为两种1. 系统日志,记录了hive的运行情况,错误状况。2. Job 日志,记录了Hive 中job的执行的历史过程。在hive/conf/ hive-log4j.properties 文件中记录了Hive日志的存储情况,默认的存储情况:hive.root.logger=WARN,DRFAhive.log.dir=/tmp/${user.name} # 默认的存储位置hive.log.file=hive.log # 默认的文件名//Location of Hive run time structured log fileHIVEHISTORYFILELOC("hive.querylog.location", "/tmp/" + System.getProperty("user.name")),默认存储与 /tmp/{user.name}目录下。
2023-07-21 01:25:101

Hive优化:严格模式

Hive提供了一个严格模式,可以防止用户执行那些可能意想不到的不好的影响查询。 通过设置属性hive.mapred.mode值为默认是非严格格式nonstrict。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3钟类型的查询。 --设置非严格模式(默认) set hive.mapred.mode=nonstrict; --设置严格模式 set hive.mapred.mode=strict; (1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行 --设置严格模式下 执行sql语句报错;非严格模式下的可以的 select * from order_partition; 异常信息:Error :Error while compliling statement:FAILED:SemanticException [Error 10041]:No parttion predicate found for Alias "order_partition" Table "order_partition" (2)对于使用了order by 语句的查询,要求必须使用limit语句 --设置严格模式下 执行sql语句报错;非严格模式下可以的 select * from order_partition where month="2019-03" order by order_price; 异常信息:Error Error while compiling statement:FAILED:SemanticException 1:61 In strict mode,if ORDER BY is specified ,LIMIT must also be specifiied.Error encountered near token "order_price" (3)限制笛卡尔积的查询 严格模式下,避免出现笛卡尔积的查询
2023-07-21 01:25:171

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高。
2023-07-21 01:25:261

Hive的几种常见的数据导入方式

零.Hive的几种常见的数据导入方式常用的的有三种: 1.从本地文件系统中导入数据到Hive表; 2.从HDFS上导入数据到Hive表; 3.在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。 Hive配置: HDFS中Hive数据文件存放目录(启动hive后HDFS自动创建): HDFS: /usr/hive/warehouse hadoop fs -mkdir /usr/hive/warehouse 命令创立 本地数据存放目录: 本地:/home/santiago/data/hive一.从本地文件系统中导入数据到Hive表1.在hive中建表hive> show databases;OKdefaultTime taken: 1.706 seconds, Fetched: 1 row(s)hive> create table guo_test(Name string,String string)> row format delimited> fields terminated by ","> stored as textfile;hive> show tables;OKguo_testTime taken: 0.024 seconds, Fetched: 1 row(s)1234567891011122.在本地文件建立同类型数据表santi@hdp:~/data/hive$ lshive_test.txtsanti@hdp:~/data/hive$ cat hive_test.txtsanti,you are a zhazha.12343.导入数据并测试hive>load data local inpath "/home/santi/data/hive/hive_test.txt" into table guo_test;hive> select * from guo_test;hive>dfs -ls /usr/hive/warehouse/guo_test; #hadoop fs -ls /usr/hive/warehouseFound 1 itemsdrwxrwxr-x - santiago supergroup 0 2017-01-14 21:13/usr/hive/warehouse/guo_test12345678发现hive-site,xml设置的HDFS文件存储位置中多了guo_test这个文件夹#hadoop fs -ls /usr/hive/warehouse/guo_testFound 1 items-rwxrwxr-x 1 santiago supergroup 24 2017-01-14 21:13/usr/hive/warehouse/guo_test/hive_test.txt hive> select * from guo_test;OKsanti you are a zhazha.12345678在该文件夹中找到了所写入hive数据仓库的文件。 [注]本地数据写入成功,但是从本地将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/santi/),然后再将数据从临时目录下移动到对应的Hive表的数据目录里面(临时目录不保留数据)。二.从HDFS文件系统中导入数据到Hive表1.在HDFS文件系统上建立数据文件 hdfs上没有vim命令,则需要将本地数据文件手动传入到HDFS上/data/hive# vim data_HDtoHive/data/hive# cat data_HDtoHivedata from, HDFS to Hive #hadoop fs -put /home/santi/data/hive/data_HDtoHive /usr/data/input//数据传入# hadoop fs -ls /usr/data/input123452导入数据hive> load data inpath "/usr/data/input/data_HDtoHive" into table guo_test;hive> select * from guo_test;OKdata from HDFS to Hive santi you are a zhazha.Time taken: 0.172 seconds, Fetched: 2 row(s)123456数据写入成功 数据存hive配置的数据存储位置中。 [注] 从本地导入数据语句为 hive>load data local inpath ‘/home/santi/data/hive/hive_test.txt" into table guo_test; 从HDFS中导入数据的语句为 hive> load data inpath ‘/usr/data/input/data_HDtoHive" into table guo_test; 差距在local这个命令这里。 而从HDFS系统上导入到Hive表的时候,数据转移。HDFS系统上查找不到相关文件。三.从HIVE表选取数据插入新的HIVE表命令为create table 表名 as selecr xxx from 表名。hive> create table hivedata_test1> as> select name> from guo_test;hive> select * from hivedata_test1;OKdata fromsantiTime taken: 0.116 seconds, Fetched: 2 row(s)123456789[注]hive是分区表有稍微区别 在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比表有a和b两个分区,则对应a=xxx,b=xx对应表的目录为/user/hive/warehouse/a=xxx user/hive/warehouse/b=xx,所有属于这个分区的数据都存放在这个目录中。hive> create table hivedata_test2(> Name string)> partitioned by> (String string)> ROW FORMAT DELIMITED> FIELDS TERMINATED BY ","> STORED AS TEXTFILE;hive> insert into table hivedata_test2> partition(String="best")> select Name> from guo_test;hive> select * from hivedata_test2;OKdata from bestsanti bestTime taken: 1.549 seconds, Fetched: 2 row(s)# hadoop fs -ls /usr/hive/warehouse/hivedata_test2Found 1 itemsdrwxrwxr-x -santiago supergroup 0 2017-02-14 17:40/usr/hive/warehouse/hivedata_test2/string=best
2023-07-21 01:26:361

Hive:分区表表结构和数据复制

摘要: Hive , Shell Hive复制表包括两种 对于非分区表如果要完全复制一张表到另一张表,直接使用CREATE TABLE ... AS语句即可,比如以下复制一个表的两个字段以及字段的值到另一个表 对于分区表如果使用CREATE TABLE ... AS语句则分区失效,但是可以执行不报错,且字段和数据都能完全复制 以上有一张分区表,以dt字段作为分区,使用CREATE TABLE ... AS进行全表复制 检查表结构和表数据量都没有问题 检查分区,报错此表不是分区表,is not a partitioned table,但是在表结构中确实存在本来的分区字段dt,此时dt字段的分区功能失效,但是数据保留住了 分区表的全称复制且带有分区的操作方法需要使用 LIKE 语句复制到分区信息,具体步骤如下 第一步复制得到一张空表,具有原表的表结构和分区信息 下一步使用hdfs命令操作将原表在hdfs的存储路径复制到新表的路径, 一张表的存储路径是一个目录,该目录下还存在子目录,每一个子目录代表一个分区,在分区目录下就是数据文件,数据文件是part开头格式,由Hive的分桶策略将同一分区下的数据进行划分 复制语句采用 * 通配符将原表目录下所有文件复制到新表路径下,查看新表的hdfs路径下数据文件 此时新表虽然对应数仓目录下有数据文件,但是在Hive客户端还是查不到数据为空表, 因为一个个数据分区不存在在新表的元数据中,数据是以分区目录为单位聚合的,新表目前查不到一个分区则自然查不到数据 下一步修复表的分区元数据,使用 MSCK REPAIR TABLE 命令 由输出的执行过程可见MSCK REPAIR TABLE命令先检查了表的分区信息是否存在在元数据,然后对不存在的分区信息进行修复,修复后该表即可正常使用 MSCK REPAIR TABLE 的作用是 只需要只用这一个命令就可以 快速 , 自动化 地添加(修复)全部分区 ,在Hive中如果先建分区表,并且以数据拷贝到对应HDFS目录这种方式作为初始化,需要手动添加分区才能使用,如果分区过多,使用 ALTER TABLE ADD PARTITION 极为不变,下面做一下测试看ALTER TABLE ADD PARTITION是否也能完成分区表的完全复制 下一步采用手动添加1个分区dt="20201209" 验证了手动分区能够完成, MSCK REPAIR TABLE只是自动化的扫描一遍数仓目录下的分区信息(dt="20201209" 到 dt="20210317") ,如果编写一个Shell脚本也能实现如下 运行这个Shell脚本后能达到同样的效果,但是这个脚本执行了15分钟,需要频繁启动和关闭Hive进程
2023-07-21 01:26:441

Hive优化的原则参考

需要满足以下条件: hive.mapred.mode=true,严格模式不允许执行以下查询: 分区表上没有指定了分区 没有limit限制的order by语句 笛卡尔积:JOIN时没有ON语句 两个聚集函数不能有不同的DISTINCT列,以下表达式是错误的: SELECT语句中只能有GROUP BY的列或者聚集函数。 第一个MRJob 中, Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key 有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到 Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。 FROM test INSERT OVERWRITE TABLE count1 SELECT count(DISTINCT test.dqcode) GROUP BY test.zipcode INSERT OVERWRITE TABLE count2 SELECT count(DISTINCT test.dqcode) GROUP BY test.sfcode; ORDER BY colName ASC/DESC hive.mapred.mode=strict时需要跟limit子句 hive.mapred.mode=nonstrict时使用单个reduce完成排序 SORT BY colName ASC/DESC :每个reduce内排序 DISTRIBUTE BY(子查询情况下使用 ):控制特定行应该到哪个reducer,并不保证reduce内数据的顺序 CLUSTER BY :当SORT BY 、DISTRIBUTE BY使用相同的列时。 增加map数目: 当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。 假设有这样一个任务:   select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from a group by data_desc 如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。   set mapred.reduce.tasks=10;   create table a_1 as select * from a distribute by rand(123); 这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。 reduce数目设置:  参数1:hive.exec.reducers.bytes.per.reducer=1G:每个reduce任务处理的数据量  参数2:hive.exec.reducers.max=999(0.95 TaskTracker数):每个任务最大的reduce数目  reducer数=min(参数2,总输入数据量/参数1)  set mapred.reduce.tasks:每个任务默认的reduce数目。典型为0.99 reduce槽数,hive将其设置为-1,自动确定reduce数目。 15.使用索引: hive.optimize.index.filter:自动使用索引 hive.optimize.index.groupby:使用聚合索引优化GROUP BY操作
2023-07-21 01:26:511

hive 建表方式及参数详解

u2003u2003 hive中有两种表:外部表和内部表(managed and external)。可以通过 desc formatted table_name 命令来查看表的信息,来辨别表是外部表还是内部表。 在hive默认创建到表是内部表,外部表创建需要加 EXTERNAL 命令,如: CREATE EXTERNAL table_name 。 u2003 u2003内部表的文件,元数据和统计信息等由hive进行管理,一般被存储在 hive.metastore.warehouse.dir 目录下,当表被删除或者分区被删除,相对应的数据和元数据就会被删除。一般用来当做临时表。 外部表与内部表相反,可以指定location,可以不基于hive来操作外部表文件。当表被删除或者分区被删除时对应的数据还会存在。只是hive删除了其元信息,表的数据文件依然存在于文件系统中。若是表被删除,可以重新建这个表,指定location到数据文件处,然后通过msck repair table table_name命令刷新数据的元信息到hive中,也就是恢复了数据。 u2003u2003 msck repair table 的详细用法就不讲了,可以参考 HIVE常用命令之MSCK REPAIR TABLE命令简述
2023-07-21 01:27:011

为什么使用Hive?Hive提供了什么?Hive支持哪些用户

为什么使用Hive?为什么使用Hive?那么,在哪里使用Hive呢?在载入了60亿行(经度、维度、时间、数据值、高度)数据集到MySQL后,系统崩溃了,并经历过数据丢失。这可能部分是因为我们最初的策略是将所有的数据都存储到单一的一张表中了。后来,我们调整了策略通过数据集和参数进行分表,这有所帮助但也因此引入了额外的消耗,而这并非是我们愿意接受的。相反,我们决定尝试使用Apache Hive技术。我们安装了Hive 0.5 + 20,使用CDHv3和Apache Hadoop(0 20 2 + 320)。CDHv3还包含有许多其他相关工具,包括Sqoop和Hue这些在我们的架构中都标识出来了,如图23-3底部所示。我们使用Apache Sqoop转储数据到Hive中,然后通过写一个Apache OODT包装器,来使Hive按照空间/时间约束查询数据,然后将结果提供给RCMET和其他用户(图23-2中间部分显示)。RCMES集群的完整的架构如图23- 3所示。我们有5台机器,包括图中所示的一个主/从配置,通过一个运行GigE的私人网进行连接。Hive提供了什么Photobucket公司使用Hive的主要目标是为业务功能、系统性能和用户行为提供答案。为了满足这些需求,我们每晚都要通过Flume从数百台服务器上的MySQL数据库中转储来自Web服务器和自定义格式日志TB级别的数据。这些数据有助于支持整个公司许多组织,比如行政管理、广告、客户支持、产品开发和操作,等等。对于历史数据,我们保持所有MySQL在每月的第一天创建的所有的数据作为分区数据并保留30天以上的日志文件。Photobucket使用一个定制的ETL框架来将MySQL数据库中数据迁移到Hive中。使用Flume将日志文件数据写入到HDFS中并按照预定的Hive流程进行处理。Hive支持的用户有哪些行政管理依赖于使用Hadoop提供一般业务健康状况的报告。Hive允许我们解析结构化数据库数据和非结构化的点击流数据,以及业务所涉及的数据格式进行读取。广告业务使用Hive筛选历史数据来对广告目标进行预测和定义配额。产品开发无疑是该组织中产生最大数量的特定的查询的用户了。对于任何用户群,时间间隔变化或随时间而变化。Hive是很重要的,因为它允许我们通过对在当前和历史数据中运行A / B测试来判断在一个快速变化的用户环境中新产品的相关特性。在Photobucket公司中,为我们的用户提供一流的系统是最重要的目标。从操作的角度来看,Hive被用来汇总生成跨多个维度的数据。在公司里知道最流行的媒体、用户、参考域是非常重要的。控制费用对于任何组织都是重要的。一个用户可以快速消耗大量的系统资源,并显著增加每月的支出。Hive可以用于识别和分析出这样的恶意用户,以确定哪些是符合我们的服务条款,而哪些是不符合的。也可以使用Hive对一些操作运行A / B测试来定义新的硬件需求和生成ROI计算。Hive将用户从底层MapReduce代码解放出来的能力意味着可以在几个小时或几天内就可以获得答案,而不是之前的数周。Hive中的数据库Hive中数据库的概念本质上仅仅是表的一个目录或者命名空间。然而,对于具有很多组和用户的大集群来说,这是非常有用的,因为这样可以避免表命名冲突。通常会使用数据库来将生产表组织成逻辑组。如果用户没有显式指定数据库,那么将会使用默认的数据库default。下面这个例子就展示了如何创建一个数据库:hive> CREATE DATABASE financials;如果数据库financials已经存在的话,那么将会抛出一个错误信息。使用如下语句可以避免在这种情况下抛出错误信息:hive> CREATE DATABASE IF NOT EXISTS financials;虽然通常情况下用户还是期望在同名数据库已经存在的情况下能够抛出警告信息的,但是IF NOT EXISTS这个子句对于那些在继续执行之前需要根据需要实时创建数据库的情况来说是非常有用的。在所有的数据库相关的命令中,都可以使用SCHEMA这个关键字来替代关键字TABLE。随时可以通过如下命令方式查看Hive中所包含的数据库:hive> SHOW DATABASES;defaultfinancialshive> CREATE DATABASE human_resources;hive> SHOW DATABASES;defaultfinancialshuman_resources如果数据库非常多的话,那么可以使用正则表达式匹配来筛选出需要的数据库名,正则表达式这个概念,将会在第6.2.3节“Like和RLike”介绍。下面这个例子展示的是列举出所有以字母h开头,以其他字符结尾(即.*部分含义)的数据库名:hive> SHOW DATABASES LIKE "h.*";human_resourceshive> ...Hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的子目录形式存储。有一个例外就是default数据库中的表,因为这个数据库本身没有自己的目录。数据库所在的目录位于属性hive.metastore.warehouse.dir所指定的顶层目录之后,这个配置项我们已经在前面的第2.5.1节“本地模式配置”和第2.5.2节“分布式模式和伪分布式模式配置”中进行了介绍。假设用户使用的是这个配置项默认的配置,也就是/user/hive/warehouse,那么当我们创建数据库financials时,Hive将会对应地创建一个目录/user/hive/warehouse/financials.db。这里请注意,数据库的文件目录名是以.db结尾的。用户可以通过如下的命令来修改这个默认的位置:hive> CREATE DATABASE financials> LOCATION "/my/preferred/directory";用户也可以为这个数据库增加一个描述信息,这样通过DESCRIBE DATABASE <database> 命令就可以查看到该信息。hive> CREATE DATABASE financials> COMMENT "Holds all financial tables";hive> DESCRIBE DATABASE financials;financials Holds all financial tableshdfs://master-server/user/hive/warehouse/financials.db从上面的例子中,我们可以注意到,DESCRIEB DATABASE语句也会显示出这个数据库所在的文件目录位置路径。在这个例子中,URI格式是hdfs。如果安装的是MapR,那么这里就应该是maprfs。对于亚马逊弹性MapReduce(EMR)集群,这里应该是hdfs,但是用户可以设置hive.metastore.warehouse.dir为亚马逊S3特定的格式(例如,属性值设置为s3n://bucketname...)。用户可以使用s3作为模式,但是如果使用新版的规则s3n会更好。前面DESCRIBE DATABASE语句的输出中,我们使用了master-server来代表URI权限,也就是说应该是由文件系统的“主节点”(例如,HDFS中运行NameNode服务的那台服务器)的服务器名加上一个可选的端口号构成的(例如,服务器名:端口号这样的格式)。如果用户执行的是伪分布式模式,那么主节点服务器名称就应该是localhost。对于本地模式,这个路径应该是一个本地路径,例如file:///user/hive/warehouse/financials.db。如果这部分信息省略了,那么Hive将会使用Hadoop配置文件中的配置项fs.default.name作为master-server所对应的服务器名和端口号,这个配置文件可以在$HADOOP_HOME/conf这个目录下找到。需要明确的是,hdfs:///user/hive/warehouse/financials.db和hdfs://master-server/user/hive/warehouse/financials.db是等价的,其中master-server是主节点的DNS名和可选的端口号。为了保持完整性,当用户指定一个相对路径(例如,some/relative/path)时,对于HDFS和Hive,都会将这个相对路径放到分布式文件系统的指定根目录下(例如,hdfs:///user/<user-name>)。然而,如果用户是在本地模式下执行的话,那么当前的本地工作目录将是some/relative/path的父目录。为了脚本的可移植性,通常会省略掉那个服务器和端口号信息,而只有在涉及到另一个分布式文件系统实例(包括S3存储)的时候才会指明该信息。此外,用户还可以为数据库增加一些和其相关的键-值对属性信息,尽管目前仅有的功能就是提供了一种可以通过DESCRIBE DATABASE EXTENDED <database>语句显示出这些信息的方式:hive> CREATE DATABASE financials> WITH DBPROPERTIES ("creator" = "Mark Moneybags", "date" = "2012-01-02");hive> DESCRIBE DATABASE financials;financials hdfs://master-server/user/hive/warehouse/financials.dbhive> DESCRIBE DATABASE EXTENDED financials;financials hdfs://master-server/user/hive/warehouse/financials.db{date=2012-01-02, creator=Mark Moneybags);USE命令用于将某个数据库设置为用户当前的工作数据库,和在文件系统中切换工作目录是一个概念:hive> USE financials;现在,使用像SHOW TABLES这样的命令就会显示当前这个数据库下所有的表。不幸的是,并没有一个命令可以让用户查看当前所在的是哪个数据库!幸运的是,在Hive中是可以重复使用USE…命令的,这是因为在Hive中并没有嵌套数据库的概念。可以回想下,在第2.7.2节“变量和属性”中提到过,可以通过设置一个属性值来在提示符里面显示当前所在的数据库(Hive v0.8.0版本以及之后的版本才支持此功能):hive> set hive.cli.print.current.db=true;hive (financials)> USE default;hive (default)> set hive.cli.print.current.db=false;hive> ...最后,用户可以删除数据库:hive> DROP DATABASE IF EXISTS financials;IF EXISTS子句是可选的,如果加了这个子句,就可以避免因数据库finanacials不存在而抛出警告信息。默认情况下,Hive是不允许用户删除一个包含有表的数据库的。用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加上关键字CASCADE,这样可以使Hive自行先删除数据库中的表:hive> DROP DATABASE IF EXISTS financials CASCADE;如果使用的是RESTRICT这个关键字而不是CASCADE这个关键字的话,那么就和默认情况一样,也就是,如果想删除数据库,那么必须先要删除掉该数据库中的所有表。如果某个数据库被删除了,那么其对应的目录也同时会被删除。
2023-07-21 01:27:131

Hive命令-权限篇

一、权限查询 1、查询master用户拥有的权限 2、查询master用户对于库dw拥有的权限 二、赋权限 给master用户赋dw库all的操作权限 三、服务器上切换登录用户
2023-07-21 01:27:281