hive进阶宝典二——hive 常用小技巧

1.日期格式转换(将yyyymmdd转换为yyyy-mm-dd)

select from_unixtime(unix_timestamp('20180905','yyyymmdd'),'yyyy-mm-dd')

2.hive修改库名、表名注释、表属性

----修改库名注释
alter database db_name set dbproperties('comment'='ISIC-BRMS-CORE');
----修改表名注释
alter table tbl_name set tblproperties ('comment'='各组织人员流失率统计表');
---将外部表修改为内部表,需要删除表的数据文件时,可以将外部表转换成内部表,再直接删除表,比较安全
alter table tbl_name set TBLPROPERTIES('EXTERNAL'='FALSE')

3..hive去掉字段中除字母和数字外的其它字符

select regexp_replace(a, '[^0-9a-zA-Z]', '') from tbl_name

4.hive解析json字段
content字段存储json {"score":"100","name":"zhou","class":''math"},若要对json进行解析,则可用以下方式

---解析单个字段
select get_json_object(content,'$.score') ,
           get_json_object(content,'$.name),
           get_json_object(content,'$.class')
 from tbl_name
---解析多个字段可以用json_tuple
select a.*
      ,b.score
      ,b.name
      ,b.class
 from tbl a 
lateral view outer json_tuple(a.content,'score', 'name', 'class') b as score,name,class

5.hive 导入数据
若从本地文件系统上传,需要加上local关键字;如果直接从hdfs路径上传,则不加local

load data [local] inpath '/data/monthcard.csv' overwrite into table tbl_name;

6.hive 避免科学计数法

select printf("%.2f",3.428777027500007E7)

7.hive collect_set和lateral view explode用法
原始数据

id1    id2    name
1       1       A
1       1       B
1       1       C
1       2       X
1       2       Y

(1)collect_set

select id1,id2,
collect_set(name) as new_name1,
collect_set(case when id2>1 then name end) as new_name2,
count(name) as cnt
from default.zql_test
group by id1,id2;
---输出结果
OK
id1     id2     new_name1       new_name2       cnt
1       1       ["C","A","B"]   []      3
1       2       ["X","Y"]       ["X","Y"]       2

(2)lateral view explode

select * 
from 
(
select id1,id2,
collect_set(name) as new_name1,
collect_set(case when id2>1 then name end) as new_name2,
count(name) as cnt
from default. zql_test
group by id1,id2
)t
lateral view explode(new_name1) t as new_type1 
lateral view explode(new_name2) t as new_type2
----输出结果
OK
t.id1   t.id2   t.new_name1     t.new_name2     t.cnt   t.new_type1     t.new_type2
1       2       ["Y","X"]       ["Y","X"]       2       Y       Y
1       2       ["Y","X"]       ["Y","X"]       2       Y       X
1       2       ["Y","X"]       ["Y","X"]       2       X       Y
1       2       ["Y","X"]       ["Y","X"]       2       X       X

(3)lateral view explode outer ,加上outer会保留所有记录,两者差异可以参考之前的专题

select * 
from 
(
select id1,id2,
collect_set(name) as new_name1,
collect_set(case when id2>1 then name end) as new_name2,
count(name) as cnt
from default. zql_test
group by id1,id2
)t
lateral view outer explode(new_name1) t as new_type1 
lateral view outer explode(new_name2) t as new_type2
;

----输出结果
OK
t.id1   t.id2   t.new_name1     t.new_name2     t.cnt   t.new_type1     t.new_type2
1       1       ["B","A","C"]   []      3       B       NULL
1       1       ["B","A","C"]   []      3       A       NULL
1       1       ["B","A","C"]   []      3       C       NULL
1       2       ["X","Y"]       ["X","Y"]       2       X       X
1       2       ["X","Y"]       ["X","Y"]       2       X       Y
1       2       ["X","Y"]       ["X","Y"]       2       Y       X
1       2       ["X","Y"]       ["X","Y"]       2       Y       Y

8.hive取前百分之几

---分组内将数据分成两片
ntile(2)over(partition by id order by create_tm)

9.hive返回星期几的方法

---2012-01-01刚好星期日
select pmod(datediff(from_unixtime(unix_timestamp()),'2012-01-01'),7) from default.dual;
 
--返回值0-6
--其中0代表星期日

10.hive产生uuid

select regexp_replace(reflect("java.util.UUID", "randomUUID"), "-", "");

11.hive中匹配中文

select  regexp '[\\u4e00-\\u9fa5]';

12.hive中regexp_extract的用法
regexp_extract(string subject, string regex_pattern, string index)
说明:抽取字符串subject中符合正则表达式regex_pattern的第index个部分的字符串

第一参数: 要处理的字段
第二参数: 需要匹配的正则表达式
第三个参数:
0是显示与之匹配的整个字符串
1 是显示第一个括号里面的
2 是显示第二个括号里面的字段...

举例:
--取一个连续17位为数字的字符串,且两端为非数字

select regexp_extract('1、非订单号(20位):00123456789876543210;
                      2、订单号(17位):12345678987654321;
                      3、其它文字','[^\\d](\\d{17})[^\\d]',0) as s1
, substr(regexp_extract('1、非订单号(20位):01234567898765432100;
                      2、订单号(17位):12345678987654321;
                      3、其它文字','[^\\d](\\d{17})[^\\d]',0),2,17) as s2
,regexp_extract('1、非订单号(20位):00123456789876543210;
                      2、订单号(17位):12345678987654321;
                      3、其它文字','[^\\d](\\d{17})[^\\d]',1) as s3;

13.hive中快速复制一张分区表及数据

  1. CREATE TABLE new_table LIKE old_table;
  2. 使用hadoop fs -cp 命令,把old_table对应的HDFS目录的文件夹全部拷贝到new_table对应的HDFS目录下;
    hadoop fs -cp /hivedata/warehouse/liuxiaowen.db/t1/* /hivedata/warehouse/liuxiaowen.db/t2/
  3. 使用MSCK REPAIR TABLE new_table;修复新表的分区元数据;

14.hive中排序方法

ORDER BY用于全局排序,就是对指定的所有排序键进行全局排序,使用ORDER BY的查询语句,最后会用一个Reduce Task来完成全局排序。
SORT BY用于分区内排序,即每个Reduce任务内排序。
distribute by:按照指定的字段或表达式对数据进行划分,输出到对应的Reduce或者文件中。
cluster by:除了兼具distribute by的功能,还兼具sort by的排序功能。

15.hive读写模式
1.Hive处理的数据是大数据,在保存表数据时不对数据进行校验,而是在读数据时校验,所以,hive这种读的模式,加载数据很快,减少延迟。而在数据具体使用的时候,再去处理,极高地提高了效率。如果补数据不符合建表规范,比如:表字段是int类型,而导入的是string类型,则hive会保存为null。读时模式的优点是,加载数据库快。
2.传统的数据库如mysql、oracle是写时模式,不符合格式的数据写不进去。RDBMS是写模式Hive是读模式我们传统的关系型数据库RDBMS是写模式。在RDBMS里,我们对表进行数据操作时候,RDBMS会用数据库的第一第二第三范式去检查数据的规范性,如果不符合规范,数据库就拒绝数据的加载和操作。这个验证过程消耗资源,在数据量大的时候,会影响效率。因为日常的关系型数据库处理的数据不是很多,效率慢点没关系。
大数据在对数据的加载的时候不进行校验,如果校验将降低效率,导致消息阻塞,影响数据库的读取效率。
关系型数据库RDBMS主要处理的是结构化的数据,对数据源本身就有很好的规范,加载结构化有规范的数据时候,可以进行校验。而hadoop等的大数据平台保存的数据源有些是结构化的,有些不是结构化的,无规律的,没联系的数据。无法进行校验,检测。如果检测,将导致大量不符合第一第二第三范式的数据不能保存

16.hive开窗函数

(链接地址这位作者写的非常好,值得学习http://lxw1234.com/archives/2015/04/181.htm

17.find_in_set

-----返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0(只能是逗号分隔,不然返回0)
select find_in_set(‘ab’,'ef,ab,de’) ;  

18.hive中查询函数的用法

desc function concat
----查看某个函数怎么使用的例子
desc function extended concat
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容