常用函数

1、数学函数

round(double a,int d ) 四舍五入

floor(double a)对给定数据进行向下舍入最接近的整数。例如floor(21.8),返回21。

ceil(double a),将参数向上舍入为最接近的整数。例如ceil(21.2),返回23 。

rand() 返回大于或等于0且小于1的平均分布随机数

abs(double a) 取绝对值

positive(int a) positive(double a) 返回A的值,例如positive(2),返回2。

2、类型转换函数

cast(expr as ) 例如将字符”1″转换为整数:cast(’1′ as bigint),如果转换失败返回NULL。

3、日期函数

from_unixtime(bigint unixtime[, string format])

UNIX_TIMESTAMP参数表示返回一个值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。

unix_timestamp()

如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 – 0100:00:00′到现在的UTC秒数)为无符号整数。

to_date(string timestamp)

返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″

year、month、day、hour、minute(string date)、second(string date)

datediff(string enddate, string startdate) 两个时间参数的日期之差

date_add(string startdate, int days) 给定时间,在此基础上加上指定的时间段。

date_sub(string startdate, int days) 给定时间,在此基础上减去指定的时间段。

4、条件函数

if(boolean testCondition, T valueTrue, T valueFalseOrNull) 判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。

COALESCE(T v1, T v2, …) 返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。

CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 当a=b时,返回c;当a=d时,返回e,否则返回f。

CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END 当值为a时返回b,当值为c时返回d。否则返回e。

5、字符函数

length(string A) 返回字符串的长度

concat(string A, string B…) 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串

substr(string A, int start) 从文本字符串中指定的起始位置后的字符

substr(string A, int start, int len) 从文本字符串中指定的位置指定长度的字符

upper(string A) 将文本字符串转换成字母全部大写形式

lower(string A) 将文本字符串转换成字母全部小写形式

trim(string A) 删除字符串两端的空格,字符之间的空格保留

ltrim(string A) 删除字符串左边的空格,其他的空格保留

rtrim(string A) 删除字符串右边的空格,其他的空格保留

regexp_replace(string A, string B, string C) 字符串A中的B字符被C字符替代

regexp_extract(string subject, string pattern, int index) 通过下标返回正则表达式指定的部分。

get_json_object(string json_string, string path)

select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;

space(int n) 返回指定数量的空格

repeat(string str, int n) 重复N次字符串

ascii(string str) 返回字符串中首字符的数字值

lpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。

rpad(string str, int len, string pad) 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。

split(string str, string pat) 按照pat字符串分割str,会返回分割后的字符串数组。

find_in_set(string str, string strList) 返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。

6、内置的聚合函数

count(*) , count(expr), count(DISTINCT expr[, expr_., expr_.]) 返回记录条数。

sum(col), sum(DISTINCT col) 求和

avg(col), avg(DISTINCT col) 求平均值

min(col) 返回指定列中最小值

max(col) 返回指定列中最大值

collect_set(col) 返回无重复记录

优化

explain命令对于我们优化查询语句很重要,针对某些查询语句,我们可以通过它查看各个执行计划,针对耗时的地方,优化之。

EXPLAIN [EXTENDED] query

1、 提前过滤掉数据,减少中间数据依赖

select ... from A

join B

on A.key = B.key

where A.userid>10 and B.userid<10 and A.dt='20120417' and B.dt='20120417';

应该改写为:

select .... from

(select .... from A

where dt='201200417' and userid>10

) a

join

( select .... from B

where dt='201200417' and userid < 10

) b

on a.key = b.key;

2、慎用map join

慎重使用mapjoin,一般行数小于2000行,大小小于1M(扩容后可以适当放大)的表才能使用,小表要注意放在join的左边。否则会引起磁盘和内存的大量消耗

使用Map Join的必要条件:

a.参与连接的小表的行数,以不超过2万条为宜。

b.连接类型是inner join、right outer join(小表不能是右表)、left outer join(小表不能是左表)、left semi join。

使用方法示例:

例如:

INSERT OVERWRITE TABLE pv_users

SELECT /*+ MAPJOIN(pv) */

pv.pageid, u.age

FROM page_view pv

JOIN user u

ON (pv.userid = u.userid);

注:当大表存在数据倾斜时,如果小表符合map join的要求,使用map join会极大加速计算。

3、 union all改成join

当需要把几个数据集的结果合并时,能使用join的话就不要使用union all。因为使用union all时通常需要加入大量的0,这会导致中间结果膨胀,增加系统负担。

4、大数据量是,怎样让全局count/sum/distinct更快

以下两个SQL,有人可能认为例句1快于例句2。

例句1:

SELECT

COUNT(DISTINCT uin) login_uins

FROM

tabled

WHERE

ftime >= 20121001 AND ftime <= 20121001

例句2:

SELECT

COUNT(uin) login_uins

FROM

( select distinct uin from tabled WHERE

ftime >= 20121001 AND ftime <= 20121001

) subq

实际上,例句2远远快于例句1。元芳,你怎么看?

例句1虽然只有1个mr,但是,这个mr却只有1个reduce任务,导致这个reduce任务需要读取和处理大量的数据,这不仅导致执行慢,而且,在如果tabled中的数据量太大,可能导致执行reduce任务的节点down掉。

例句2先去重,后全局统计,没有像例句1那样明显的瓶颈。所以,请牢记当对某个数据集进行全局count distinct操作时,尽量用例句2的形式。

在其他情况下,即使有group by,但是group by的维度太低,也可以考虑这种改写方法。也就是说,一定要避免group by的维度太低。

5、合并小文件

文件数目过多,会给 HDFS 带来压力,并且会影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响:

a) hive.merge.mapfiles = true是否和并 Map 输出文件,默认为 True

b) hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False

c) hive.merge.size.per.task = 256*1000*1000合并文件的大小

6、 排序优化

Order by 实现全局排序,一个reduce实现,效率低

Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key)

CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1

7、动态分区

在hive中,有时候会希望根据输入的key,把结果自动输出到不同的目录中,这可以通过动态分区来实现,就是把每一个key当作一个分区。

如果要启动动态分区,则需要进行下面的设置

1) 首先需要在hive语句中设置允许动态分区

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

2) 在动态分区有可能很大的情况下,还需要其他的调整

hive.exec.dynamic.partitions.pernode 参数指的是每个节点上能够生成的最大分区,这个在最坏情况下应该是跟最大分区一样的值

hive.exec.dynamic.partitions.partitions 参数指的是总共的最大的动态分区数

hive.exec.max.created.files 参数指的是能够创建的最多文件数(分区一多,文件必然就多了...)

3) 最后要注意的是select语句中要把distribute的key也select出来

4) 适当设置reduce个数 mapred.reduce.tasks

比如经常遇到的此问题:

org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /tmp/hive-maintain/hive_2012-11-28_22-39-43_810_1689858262130334284/_task_tmp.-ext-10002/part=33436268/_tmp.000004_0 File does not exist. Holder DFSClient_attempt_201211250925_9859_m_000004_0 does not have any open files.

可以设置

SET hive.exec.max.dynamic.partitions=100000;

SET hive.exec.max.dynamic.partitions.pernode=100000;

8、数据倾斜

数据倾斜的外在表现是执行时间超长。查看任务的监控页面可以发现,除了一个或几个任务外,其他reduce任务都执行的很快。这种情况下,只有一个解释:数据倾斜。

分析函数hive计算均值_hive常用函数及优化相关推荐

  1. 分析函数hive计算均值_Hive中的函数

    函数分类 UDF user-define-function:用户定义函数 进一条出一条 UDAF user-define-aggregation-function:用户定义聚合函数 进多条出一条 如: ...

  2. 分析函数hive计算均值_Hive 分析函数

    应用场景 (1)用于分区排序 (2)Top N (3)层次查询 常用分析函数 | 分析函数 | 描述 | | --- | --- | | RANK | 返回数据项在分区中的排名.排名值序列可能会有间隔 ...

  3. hive in 字符串_hive常用函数 concat concat_ws row_number

    在应用hive在数据仓库中进行数据提取中经常会用户很多函数,为了记录自己常用的hive函数,特写这个系列的文章,记录下自己的使用心得,其中包括使用场景.用法等. 1.concat concat是字符拼 ...

  4. hive 复合类型_hive 常用函数整理 9.复合类型操作

    1. map类型构建: map 语法: map (key1, value1, key2, value2, -) 说明:根据输入的key和value对构建map类型 举例: hive> Creat ...

  5. 大数据基础之Hive(四)—— 常用函数和压缩存储

    作者:duktig 博客:https://duktig.cn (文章首发) 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 更多文章参看github知识库:https://github.com/dukt ...

  6. HiveQL学习笔记(二):Hive基础语法与常用函数

    本系列是本人对Hive的学习进行一个整理,主要包括以下内容: 1.HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介 2.HiveQL学习笔记(二):Hive基础语法与常用函数 ...

  7. hive中字段长度函数_Hive常用函数总结

    hive函数的分类 hive的客户端 显示当前会话有多少函数可用 SHOW FUNCTIONS; 如: hive> show functions ; OK ! != % 显示函数的描述信息 DE ...

  8. hive 语句总结_Hive常用命令总结

    本文只是总结一些在Hive中常用的命令,并且假设需要的目录或者数据已经存在. 创建表,\t作为列的分隔符 create table trade_detail (id bigint,income dou ...

  9. hive 解密_Hive 常用函数

    2. concat(str1,SEP,str2,SEP,str3,--) 和 concat_ws(SEP,str1,str2,str3, --) 字符串连接函数,需要是 string型字段. 如果4个 ...

最新文章

  1. 多目标决策问题1.1.1:线性加权法——熵权法确定权重
  2. Android UI法宝的设计资源的开发
  3. ipv6 访问内网_【内网渗透】—— 隐藏通信隧道技术之网络层隧道技术
  4. R树空间索引及其变种
  5. js字符串replace替换多个_汇总几大python常见字符串处理函数与用法(建议收藏)...
  6. HTML DOM 对象简单介绍
  7. 区块链 Fisco bcos 智能合约(17)-区块链的速度困境:“贵”在信任,“慢”得其所
  8. 收获,不止oracle
  9. 克莱姆法则(Cramer's Rule)
  10. 智能医疗二次爆发,医疗的全产业链何时打通?
  11. 服务器搬迁方案_网站云服务器迁移方案需要注意什么?
  12. 沉浸式体验在文化展馆设计中应用
  13. Codeforces469div2F curfew(贪心)
  14. java fifo lifo_栈方法 LIFO - 队方法 FIFO
  15. DSP CCS12.00 芯片:TMS320F28335 结课设计 数字电压表 TFTLCD 模块 + ADC 模块
  16. 路由器dns服务器为空,家用路由器设置里的DNS服务器是什么?有什么作用呢?
  17. 各种下载文件方式总结
  18. 什么是双亲委派机制?
  19. 会声会影无法导入.ts文件编辑解决办法
  20. 电视android内置系统界面,系统界面:原生安卓 定制界面_汽车科技评测-中关村在线...

热门文章

  1. 【Python】从“历年全国出生人口”看,如何用Python来制作可视化动态图
  2. Arduino入门_串口通信
  3. JAVA毕设项目汽车客运站票务管理系统(java+VUE+Mybatis+Maven+Mysql)
  4. 第一个项目: 票务管理系统
  5. CPU卡程序设计实例(八)ESAM模块卡上、下电
  6. (实用详细)快速入门北斗短报文RDSS协议/北斗协议
  7. linux 挂载 nfs 权限,救急:nfs挂载问题
  8. python 边读边写文件_python也可以边玩边学,试试做个字符画看看
  9. 超融合火了这么多年,为何市场份额还是这么小?
  10. Centos7 firewall的使用,以开放3306端口为例