常用HiveQL

1、在命令行提示符前显示操作的数据库:

hive > set hive.cli.print.current.db=true;

2、查询结果显示字段名称:

hive > set hive.cli.print.header=true;

3、执行shell命令:

hive > ! ls;

4、执行dfs命令:

hive > dfs -ls;

5、hive脚本中,–表示注释,在命令行中不能使用

6、数据类型转换:

hive >cast (s as int);

7、显示表的详细信息:

hive >desribe formatted/extended tablename;

8、将Hive设置为“strict(严格)”模式,这样如果对分区表进行查询而where子句没有加分区过滤的话,将会禁止提交这个任务。

hive> set hive.mapred.mode=strict/nostrict;

9、动态分区插入数据的写法:

hive >insert overwrite table table1 partition (a,b) select …,c,d from test2;

10、rand():返回一个0~1随机值

11、了解Hive是如何将查询转化成MapReduce任务的:

hive >explain select sum(a) from test;

hive >explain extended select sum(a) from test;

12、指定日志为DEBUG级别,而且输出到控制台

hive -hiveconf hive.root.logger=DEBUG,console

13、发现和描述函数:

hive >show functions;

hive >describe function concat;

hive >describe function extended concat;

14、标准函数:UDF(一对一)

        聚合函数:UDAF(多对一)

        表生成函数:UNTF(一对多)

15、宏命令(某些时候比函数方便)

hive >create temporary macro sigmoid (x double) 1.0 / (1.0 + exp(-x));

hive >select sigmoid(2) from src limit 1;

16、关于Hive中的用户,组和角色

hive (default)> set hive.security.authorization.enabled;

hive.security.authorization.enabled=false

hive (default)> set system:user.name;

system:user.name=hadoop

hive (default)> show grant user hadoop;

OK

default                hadoop    USER    ALL    false    1522203964000    hive

test                hadoop    USER    ALL    false    1522205200000    hive

zb_dwa                hadoop    USER    ALL    false    1522203974000    hive

zb_dwd                hadoop    USER    ALL    false    1522203972000    hive

zb_src                hadoop    USER    ALL    false    1522203972000    hive

zb_src_test                hadoop    USER    ALL    false    1522203972000    hive

zb_dwa    t_code            hadoop    USER    ALL    true    1524211395000    hadoop

zb_dwa    t_code_source            hadoop    USER    ALL    true    1524204335000    hadoop

Time taken: 2.214 seconds, Fetched: 18 row(s)

hive (default)> show grant user hadoop on database default;

OK

default                hadoop    USER    ALL    false    1522203964000    hive

Time taken: 0.026 seconds, Fetched: 1 row(s)

17、什么情况下Hive可以避免MapReduce?

hive > set hive.exec.mode.local.auto=true;

    Hive中对于某些情况的查询可以不必使用MapReduce,也就是所谓的本地模式。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employees对应的存储目录下的文件,然后输出格式化后的内容到控制台。对于WHERE语句中过滤条件只是分区字段这种情况,也是无需使用MapReduce过程的。

18、JOIN优化

 □ 当对3个或者更多个表进行JOIN连接时,如果每个ON子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

 □  Hive同时假定查询中最后一个表是最大的那个表。在对每行记录进行连接操作时,它会尝试将其它表缓存起来,然后扫描最后那个表进行计算。因此,用户需要保证连续查询中的表的大小从左到右是依次增加的。

 □ Hive还提供了一个“标记”机制来显式的告之查询优化器哪张表是大表,使用方式如下:

hive > SELECT /*+STREAMTABLE(s)*/s.ymd,s.symbol,s.price_close,d.dividend FROM stocks s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol WHERE s.symbol = ‘AAPL’ ;

19、map-side JOIN

    如果所有表中只有一张表是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行连接过程(称为map-side JOIN),这是因为Hive可以和内存中的小表进行逐一匹配,从而省略常规连接操作所需要的reduce过程。即使对于很小的数据量,这个优化也明显的要快于常规的连接操作。其不仅减少了reduce过程,而且有时还可以同时减少map过程的执行步骤。

    在Hive v0.7之前的版本,如果想要使用这个优化,需要在查询语句中增加一个标记来进行触发。

hive > SELECT /*+MAPJOIN(d)*/s.ymd,s.symbol,s.price_close,d.dividend FROM stocks s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol WHERE s.symbol = ‘AAPL’ ;

    从Hive v0.7版本开始,废弃了这种标记的方式,不过如果增加这个标记还是有效的。用户需要配置属性hive.auto.convert.join为true,默认情况下这个属性为false。用户也可以配置能够使用这个优化的小表的大小,配置属性为hive.mapjoin.smalltable.filesize,默认值为25000000。

hive > set hive.auto.convert.join = true;

hive > set hive.mapjoin.smalltable.filesize = 25000000;

hive > SELECT s.ymd,s.symbol,s.price_close,d.dividend FROM stocks s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol WHERE s.symbol = ‘AAPL’ ;

    Hive对于右外连接和全外连接不支持这个优化。

    如果所有表中的数据是分桶的,那么对于大表,在特定的情况下同样可以使用这个优化。简单地说,表中的数据必须是按照ON语句中的键进行分桶的,其中一张表的分桶个数必须是另外一张表的分桶个数的若干倍。当满足这些条件时,那么Hive可以在map阶段按照分桶数据进行连接。不过这个优化同样默认是没有开启的,需要设置参数hive.optimize.bucketmapjoin为true,默认是false。

hive > set hive.optimize.bucketmapjoin = true;

常用HiveQL

20、ORDER BY 和 SORT BY

    Hive中ORDER BY会对结果进行一个全局排序。也就是说会有一个所有数据都通过一个reducer进行处理的过程。对于大数据集,这个过程可能会消耗太过漫长的时间。如果属性hive.mapred.mode的值是strict的话,那么Hive要求这样的语句必须加有LIMIT语句进行限制。默认情况下,这个属性的值是nostrict。

    SORT BY只会在每个reducer中对数据进行排序,也就是执行一个局部排序的过程。这样可以保证每个reducer的输出数据都是有序的(但并非全局有序)。这样可以提高后面进行的全局排序的效率。

常用HiveQL

    如果使用的reducer的个数大于1的话,那么输出结果的排序就大不一样了,既然只保证每个reducer的输出是局部排序的,那么不同reducer的输出就可能会有重叠的。

21、含有SORT BY的DISTRIBUTE BY

    DISTRIBUTE BY控制map的输出在reducer中是如何划分的(按照指定的字段对数据进行划分输出到不同的reducer中)。MapReduce job中传输的所有数据都是按照键-值对的方式进行组织的,因此Hive再将用户的查询语句转换成MapReduce job时,其必须在内部使用这个功能。

    默认情况下,MapReduce计算框架会依据map输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均匀分发到多个reducer中去。这也就意味着当我们使用SORT BY时,不同reducer的输出内容会有明显的重叠,至少对于排列顺序而言是这样,即使每个reducer的输出的数据都是有序的。

常用HiveQL

    DISTRIBUTE BY和GROUP BY在其控制着reducer是如何接受一行行数据进行处理这方面是类似的,而SORT BY则控制着reducer内的数据是如何进行排序的。

    需要注意的是,Hive要求DISTRIBUTE BY语句要卸载SORT BY语句之前。

22、CLUSTER BY

    CLUSTER BY除了具有DISTRIBUTE BY的功能外还兼具SORT BY的功能。

常用HiveQL

    使用DISTRIBUTE BY……SORT BY语句或其简化版的CLUSTER BY语句会剥夺SORT BY的并行性,然而这样可以实现输出文件的数据是全局排序的。

23、ROW_NUMBER()分组排序取TOP 1

hive > SELECT * FROM (SELECT m.qq_fwbzh,m.xxzjbh,ROW_NUMBER() OVER(PARTITION BY m.qq_fwbzh ORDER BY  m.xxrksj DESC) as flag FROM zb_src.zy_sh_qqdjxx m) t WHERE t.flag=1;

24、hive中的替换

select regexp_replace(sfzbh,”‘”,””),regexp_replace(glkh,”‘”,””) from DWD_Z_SG_BG_MGJCRY limit 10;

25、实现hive里横转纵的功能,使用说明: lateral view explode(split(列名,’分隔符’)) ,这个函数必须要有别名

示例:select gmsfhm,  gddh2   from zb_dwa.DWA_R_JB_RYDHHMK t lateral view explode(split(t.gddh,’,’))a as gddh2 where gmsfhm=’152301198209100568′;

152632196712060315    ,13088573907,13034744906    

转化成                   

152632196712060315    13088573907

152632196712060315    13034744906

26、hive格式转换

cast(c.code as int)=cast(a.mz_dm as int)

27、hive 纵变横

原始:

sys_region (id,name)

1 a

1 b

2 c

2 d

select id,concat_ws(‘,’,collect_set(name))

from sys_region

group by id;

结果:

1 a,b

2 c,d

28、修改表注释

alter table DWA_R_GJ_GLKYGPXX set tblproperties(‘comment’=’公路客运售票信息整合表’);

29、一些Hive优化

set hive.groupby.skewindata=true;                                                   //当数据出现倾斜时,会自动进行负载均衡

set hive.exec.compress.output=true;                                                 //hive最终输出是否压缩

set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;      //map的输出压缩方式

set mapred.output.compression.type=BLOCK;                                           //压缩类型,默认为RECORD,压缩单独的记录,BLOCK为块压缩

set mapreduce.map.memory.mb=2049;                                                   //每个map的内存大小

set mapreduce.reduce.memory.mb=2049;                                                //每个reduce的内存大小

set hive.exec.parallel=true;                                                        //控制同一个sql中的不同的job是否可以同时运行,默认为false

set hive.exec.parallel.thread.number=4;                                             //控制对于同一个sql来说同时可以运行的job的最大值,默认为8

set mapred.max.split.size=256000000;                                                //决定每个map处理的最大的文件大小,单位为B

set mapred.min.split.size.per.node=100000000;                                       //节点中可以处理的最小的文件的大小

set mapred.min.split.size.per.rack=100000000;                                       //机架中可以处理的最小的文件的大小

set hive.merge.mapfiles=true;                                                       //在Map-only的任务结束时合并小文件

set hive.merge.mapredfiles=true;                                                    //在Map-Reduce的任务结束时合并小文件

set hive.merge.size.per.task=128000000;                                             //合并文件的大小

set hive.meger.smallfiles.avgsize=100000000;                                        //当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;          //hive的输入 InputFormat

set hive.hadoop.supports.splittable.combineinputformat=true;                        //是否支持可切分的combineinputformat

set mapred.reduce.tasks=10;

set hive.exec.compress.output=true;                                                 //hive最终输出是否压缩

set mapred.compress.map.output=false;                                                    //hadoop参数,map输出是否压缩

set mapred.output.compress=true;                                                    //hadoop参数,reduce输出是否压缩

30、查询时间戳

hive > select from_unixtime(unix_timestamp()) from test;

31、一些正则

select gmsfhm from DWD_R_JG_ZDRKXX where gmsfhm not rlike “^[0-9]{15}$” and gmsfhm not rlike “^[0-9]{17}[0-9Xx]{1}$”;

select * from dwd_r_jg_zdrkxx where lxdh rlike “^+86[0-9]{11}$”;

select * from dwd_r_jg_zdrkxx where lxdh rlike “^[0-9]{4}-[0-9]{7}$”;

select * from dwd_r_jg_zdrkxx where lxdh rlike “^+86[0-9]{11}$” or lxdh rlike “^[0-9]{4}-[0-9]{7}$”;

获取当前时间:select from_unixtime(unix_timestamp(),’yyyy-MM-dd HH:mm:ss’);

匹配姓名: select xm from dwd_r_jg_zdrkxx where xm not rlike “^[//u4e00-//u9fa5]+[.]?[//u4e00-//u9fa5]+$”;

           select * from dwd_r_jg_zdrkxx where xm is null;

32、Hive建表并指定分隔符

hive (zb_dim)> create table code_zylb(code string,name string) ROW FORMAT delimited fields terminated by ‘/t’;

OK

Time taken: 0.131 seconds

hive (zb_dim)> load data local inpath ‘/home/hadoop/code_zylb.txt’ into table code_zylb;

Loading data to table zb_dim.code_zylb

Table zb_dim.code_zylb stats: [numFiles=1, totalSize=10765]

OK

Time taken: 0.426 seconds

33、添加字段

alter table civil_aviation_in_port add columns (sfzh string comment ‘身份证号’);

34、DEBUG模式启动hiveserver2,并指定hiveserver2服务器

nohup hive –service hiveserver2 –hiveconf hive.root.logger=DEBUG,console –hiveconf hive.server2.thrift.bind.host=hadoop02 &

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/194331.html

(0)
上一篇 2021年11月16日
下一篇 2021年11月16日

相关推荐

发表回复

登录后才能评论