数据类型 | 所占字节 |
---|---|
TINYINT | 1字节整数 |
SMALLINT | 2字节整数 |
INT/INTRGER | 4字节整数 |
BIGINT | 8字节整数 |
FLOAT | 4字节单精度浮点数 |
DOUBLE | 8字节双精度浮点数 |
DATE | |
STRING |
数据类型 | 描述 | 示例 |
---|---|---|
ARRAY | 一组有序字段。字段类型必须相同 | Array(1,2) |
MAP | 一组无序的键值对,键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值的类型也必须相同 | Map('a',1,'b',2) |
STRUT | 一组命名的字段,字段类型可以不同 | Struct('a',1,1,0) |
hive中没有索引,导致查询速度很慢,如果不设置分区,则每次查询会全表扫描
from->where->group by->having->select->order by->limit
hive数据库中存储的时间是string类型的(string是字符串,int是整数)
转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式,返回值: string
select from_unixtime(1323308943,'yyyy-MM-dd HH:mm:ss'); --2011-12-08 09:49:03 select from_unixtime(1323308943,'yyyyMMdd'); --20111208 select from_unixtime(1323308943,'yyyy-MM-dd'); --2011-12-08 select from_unixtime(1323308943,'yyyy-MM'); --2011-12
select unix_timestamp() --1323309615(获得当前时区的UNIX时间戳) select unix_timestamp('2011-12-07 13:01:03') --1323234063(转换格式为“yyyy-MM-dd HH:mm:ss“的日期到UNIX时间戳。如果转化失败,则返回0。) select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss'); --1323234063 select unix_timestamp('2011-12-07 13:05','yyyy-MM-dd HH:mm'); --1323234300 select unix_timestamp('2011-12','yyyy-MM'); --1322668800(转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0)
只能识别 2011-12-07 13:01:03 这种完全格式的时间,返回值: bigint
select date_format('2015-04-08', 'y'); --2015 select date_format('2015-04-08', 'yyyy'); --2015 select date_format('2015-04-08', 'yyyy-MM'); --2015-04 select date_format('2015-04-08 10:10:01', 'yyyy-MM'); --2015-04 select date_format('2015-04-08', 'yyyy-MM-dd'); --2015-04-08
说明: 返回日期时间字段中的日期部分。返回值:string,year()、month()、day()、month()、minute()、second()同理。
select to_date('2011-12-08 10:03:01'); --2011-12-08 select to_date('2011-12-08'); --2011-12-08 select to_date('2011-12'); --NULL
说明: 返回日期在当前的周数,返回值: int
select weekofyear('2011-12-08 10:03:01'); --49
CAST()函数将任何类型的值转换为具有指定类型的值。目标类型可以是以下类型之一:BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED
cast(create_time as timestamp) --把create_time创建时间转化成timestamp类型
在json字符串中提取出想要的字段和值
--如在字段extra1(string):{"systemtype": "android", "education": "doctor", "marriage_status": "1", "phonebrand": "VIVO"} ;提取出extra1和extra2中的手机品牌: select get_json_object(extra1,'$.phonebrand') as phone_brand,count(distinct user_id) from user_info group by get_json_object(extra1,'$.phonebrand');
regexp_replace(substr(create_time,1,10),'-','') regexp_replace(to_date(create_time),'-','')
sum()、count()等(sum(),avg(),max(),count(),min()这五个聚合函数之间不可以互相嵌套。 如不允许嵌套组合avg(count(*));)
where 1=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表或者观察表结构
在连接表时,需要注意表的连接条件的字段类型是否是一致的,如果出现不一致的情况,需要进行转换
如:表1和表2的连接条件为user_id,如果表1的user_id是bigint型,表2的user_id是string型,如果直接连接,则会导致数据出现的膨胀的情况,则需要对数据进行转换,如cast(user_id as bigint),,将string类型的user_id转换成整型的user_id。
percentile_approx(字段名,0.5)
order by会引发全局排序,使用distribute和sort进行分组排序效率更快(sort by 替换order by,配合distribute by一起使用)
select * from store cluster by merid; select * from store distribute by merid sort by merid asc
能使用group by代替distinct就不要使用distinct,group by 代替distinct去重数据,会有多个mapreduce执行,大数据量情况下比较好用。
小表前置,因为hive在解析sql的时候会把第一个表放进内存
【1】Hive基本简介和基础语句:https://zhuanlan.zhihu.com/p/154379734
【2】在互联网公司实习中使用Hive SQL的一些体会和注意点:https://zhuanlan.zhihu.com/p/214254848
【3】hive中distribute by 、sort by 、cluster by 、order by的区别:https://www.jianshu.com/p/193b69210a82
【4】hive中sql优化有哪些:https://zhuanlan.zhihu.com/p/133455414
【5】hive group by distinct区别以及性能比较:https://blog.csdn.net/xiaoshunzi111/article/details/68484426