Hive常用算子实现原理简述--MapReduce版

Hive常用算子实现原理简述--MapReduce版,第1张

Hive中的常用算子包括distinct、join、group by、order by、distribute by、sort by、count等,这些 *** 作符在SQL中使用起来很方便,能快速达到我们想要的效果,但是这些算子在底层是怎么实现的呢?

order by很容易想到执行原理,在一个reduce中将所有记录按值排序即可。因此order by在数据量大的情况下执行时间非常长,容易out of memory,非特殊业务需求一般不使用。distribute by也比较明显,根据hash值将distribute的值分发到不同的reduce。sort by是小号的order by,只负责将本reducer中的值排序,达到局部有序的效果。sort by和distribute by配合使用风味更佳,二者可以合并简写为cluster by。count则更加明晰,在combiner或reducer处按相同键累加值就能得到。

比较复杂的是distinct、join、group by,本文重点讨论这三个算子在MapReduce引擎中的大致实现原理。班门弄斧,抛砖引玉。

map阶段,将group by后的字段组合作为key,如果group by单字段那么key就一个。将group by之后要进行的聚合 *** 作字段作为值,如要进行count,则value是1;如要sum另一个字段,则value就是该字段。

shuffle阶段,按照key的不同分发到不同的reducer。注意此时可能因为key分布不均匀而出现数据倾斜的问题。

reduce阶段,将相同key的值累加或作其他需要的聚合 *** 作,得到结果。

对group by的过程讲解的比较清楚的是这篇文章 >

对spark、hive、impala、hdfs的常用命令作了如下总结,欢迎大家补充!

1 Spark的使用:

以通过SecureCRT访问IP地址:1010234198 为例进行说明:

先输入:ll //查询集群是否装有spark

>su - mr

>/home/mr/spark/bin/beeline -u "jdbc:hive2:/bigdata198:18000/" -n mr -p ""

>show databases; //显示其中数据库,例如

>use bigmax; //使用数据库bigmax

>show tables; //查询目录中所有的表

>desc formatted TableName; //显示表的详细信息,包括分区、字段、地址等信息

>desc TableName; //显示表中的字段和分区信息

>select count() from TableName; //显示表中数据数量,可以用来判断表是否为空

>drop table TableName; //删除表的信息

>drop bigmax //删除数据库bigmax

>describe database zxvmax //查询数据库zxvmax信息

创建一个表

第一步:

>create external table if not exists lte_Amaze //创建一个叫lte_Amaze的表

( //括号中每一行为表中的各个字段的名称和其所属的数据类型,并用空格隔开

DateTime String,

MilliSec int,

Network int,

eNodeBID int,

CID int,

IMSI String,

DataType int,

AoA int,

ServerRsrp int,

ServerRsrq int,

TA int,

Cqi0 Tinyint,

Cqi1 Tinyint //注意,最后一个字段结束后,没有逗号

)

partitioned by (p_date string, p_hour INT) //以p_date和p_hour作为分区

row format delimited fields terminated by ',' //表中行结构是以逗号作为分隔符,与上边的表中字段以逗号结尾相一致/

stored as textfile; //以文本格式进行保存

第二步:添加分区,指定分区的位置

>alter table lte_Amaze add partition (p_date='2015-01-27',p_hour=0) location'/lte/nds/mr/lte_nds_cdt_uedetail/p_date=2015-01-27/p_hour=0';

//添加lte_Amaze表中分区信息,进行赋值。

//并制定分区对应目录/lte/nds/mr下表lte_nds_cdt_uedetail中对应分区信息

第三步:察看添加的结果

>show partitions lte_Amaze; //显示表的分区信息

2 hdfs使用:

#su - hdfs //切换到hdfs用户下 、

#hadoop fs –ls ///查看进程

# cd /hdfs/bin //进入hdfs安装bin目录

>hadoop fs -ls /umtsd/cdt/ //查询/umtsd/cdt/文件目录

>hadoop fs -mkdir /umtsd/test //在/umtsd目录下创建test目录

>hadoop fs -put /home/data/u1002csv /impala/data/u5002 //将home/data/u1002csv这个文件put到hdfs文件目录上。put到hdfs上的数据文件以逗号“,”分隔符文件(csv),数据不论类型,直接是数据,没有双引号和单引号

>hadoop fs -rm /umtsd/test/testtxt //删除umtsd/test目录下的testtxt文件

>hadoop fs -cat /umtsd/test/testtxt //查看umtsd/test目录下的testtxt文件内容

3hive *** 作使用:

#su - mr //切换到mr用户下

#hive //进入hive查询 *** 作界面

hive>show tables; //查询当前创建的所有表

hive>show databases; //查询当前创建的数据库

hive>describe table_name; {或者desc table_name}//查看表的字段的定义和分区信息,有明确区分(impala下该命令把分区信息以字段的形式显示出来,不怎么好区分)

hive> show partitions table_name; //查看表对应数据现有的分区信息,impala下没有该命令

hive> quit;//退出hive *** 作界面

hive>desc formatted table_name; 查看表结构,分隔符等信息

hive> alter table ceshi change id id int; 修改表的列数据类型 //将id数据类型修改为int 注意是两个id

hive> SHOW TABLES 's'; 按正条件(正则表达式)显示表,

[mr@aico ~]$ exit; 退出mr用户 *** 作界面,到[root@aico]界面

impala *** 作使用:

#su - mr //切换到mr用户下

#cd impala/bin //进入impala安装bin目录

#/impala/bin> impala-shellsh -i 1010234166/localhost //进入impala查询 *** 作界面

[1010234166:21000] >show databases; //查询当前创建的数据库

[1010234166:21000] >use database_name; //选择使用数据库,默认情况下是使用default数据库

[1010234166:21000] > show tables; //查询当前数据库下创建的所有表

[1010234166:21000] >describe table_name; //查看表的字段的定义,包括分区信息,没有明确区分

[1010234166:21000] > describe formatted table_name; //查看表对应格式化信息,包括分区,所属数据库,创建用户,创建时间等详细信息。

[1010234166:21000] >refresh table_name; //刷新一下,保证元数据是最新的

[1010234166:21000] > alter TABLE U107 ADD PARTITION(reportDate="2013-09-27",rncid=487)LOCATION '/umts/cdt/

MREMITABLE/20130927/rncid=487' //添加分区信息,具体的表和数据的对应关系

[1010234166:21000] > alter TABLE U100 drop PARTITION(reportDate="2013-09-25",rncid=487); //删除现有的分区,数据与表的关联

[1010234166:21000] >quit; //退出impala *** 作界面

[mr@aicod bin]$ impala-shell; 得到welcome impala的信息,进入impala 查询 *** 作界面

[aicod:21000] > 按两次tab键,查看可以用的命令

alter describe help profile shell values

connect drop history quit show version

create exit insert select unset with

desc explain load set use

楼主说的是Hive,不是HBase。从Oracle里面头导出数据为平面文件后,导入HDFS里面。Hive里面的表结构是要自己手工定的。

建表可以自己写个小程序实现,根据oracle字典表和hive的建表规则,每个地方使用hive的情景不同,建表也不同。数据装载可以用sqoop来实现。

你可以安装下SQOOP,注意这个跟HADOOP的版本要对应的,不然会出现一些问题。以下是我项目用到的例子,不过我有个更高级的方法,只需配到表就行了,就是写个JAVA程序,然后自动生成对应的脚本,再执行就可以了。转载,仅供参考。

以上就是关于Hive常用算子实现原理简述--MapReduce版全部的内容,包括:Hive常用算子实现原理简述--MapReduce版、Hive中的关键字、spark、hive、impala、hdfs的常用命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9496772.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存