JAVA开发搞了一年多的大数据,究竟干了点啥( 三 )

1.9炸裂函数Hive版本:selectid,type_id_newfrom table_onelateral view explode(split(type_id,",")) table_one_temp as type_id_new;Mysql版本:SELECTa.id, substring_index(substring_index(a.type_id,',',b.help_topic_id + 1),',' ,- 1) AS type_idFROM(select id, type_id from table_one) aJOIN mysql.help_topic b ON b.help_topic_id <(length(a.type_id) - length( replace(a.type_id, ',', '')) + 1)简而言之,炸裂函数从命名上就可以看出,这是一个由1到多的过程,由一个裂变成多个 。具体场景大概是某条数据的某个字段里面存放的是被相同符号分割的字符串,我们暂时用逗号分割来讲述,拿我们案例来讲,假设一条数据的id = 1,type_id = 1,2,3 ,通过以上的炸裂函数处理之后,该条查询结果将变成3条,分别为id=1、type_id_new =1,id=1、type_id_new =2,id=1、type_id_new =3,也就是被炸裂的字段数据分割,剩余字段全部保持不变 。
1.10COALESCE ( expression,value1,value2……,valuen)selectcoalesce(demo_id1,demo_id2,demo_id3) from demo_db.demo_table;selectcoalesce(case when demo_name like '%杰伦%' then '杰粉' when demo_name like '%许嵩% ' then '嵩鼠' else '小泷包' end,demo_name2);coalesce函数其实就是找到第一个不为NULL的表达式,将其结果返回,假设全部为NULL,最后只能返回NULL,从我以上案例可以看出来,每个参数不仅仅可以写字段,也可以嵌入其他的表达式,像第二行嵌入了一串case when then,那也仅仅是一个参数而已 。
注意点,coalesce函数只是判断是否为NULL,它不会判断空串,假设第一个不为NULL的参数为空串‘’,那么它也会将这个空串当做有值查出来的 。
1.11group by field1,field2 havingselectyear,sex,goods_name,sum(goods_number) as numfrom demo_db.demo_tablegroup by year,sex,goods_namehavingnum>1000group by 用法确实比较常见,写在这里也是因为平时做数据统计基本每次都会用得到,想着写上吧显得没什么技术含量,不写又对不起这个好用的聚合语法,以上的demo呢便是统计每一年男女各对每种商品的购买量是多少,并把销量在1000以上的数据找出来,这个写法便是先对年份分组,再对性别分组,然后又对商品名称分组,分好组后便使用sum函数对商品销量进行求和 。
1.12 随机抽样:distribute by rand() sort by rand()select * from ods_user_bucket_log distribute by rand() sort by rand() limit 10;rand函数前的distribute和sort关键字可以保证数据在mapper和reducer阶段是随机分布的,像用例中写的那样就是随机抽样取10条数据 。
1.13 A left join B on a.field1= b.filed1 where B.field1 is nullselect a.*from demo_db.demo_tableA aleft join demo_db.demo_tableB bon a.demo_id = b.demo_id where b.demo_id is nullleft join 这个写法一让我拿出来介绍属实让人笑掉大牙,左连接么,谁不会,左表全查白 。当然,我列出来这个当然不是通俗的告诉大家一下我会左连接哎,我好棒棒啊,其实就是因为平时工作时总是需要把某表A和另一表B中做比较,将A中存在的属于B的部分给排除掉,此刻,我上述写的万能公式便能用到了,别笑,语法简单,但是遇到这种情况时,不经常写Sql的人可能都想不太到 。
再补充一个知识点,在使用连接时,主表越小,那么查询效率越高,因此如果遇到一些inner join场景,主表次表换一下位置对查询结果没影响的话,可以记着将数据量字段量小的表放在主表位置上 。
1.14 创建函数调用Jave-Jar中的方法--语法create temporary function 方法名 as 'java类的全限定名' using jar 'jar包在hdfs上的位置';--案例create temporary function decryption as 'com.zae.aes.Decrypt' using jar 'hdfs://namenodeha/user/zae/secret/decryption_demo.jar';1.15 摆出一条大SQL看看

经验总结扩展阅读