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


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看看

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

文章插图
这个是最近写的一条中等规模大小的SQL吧,只有50行左右而已,其他太长的也不好截屏,里面就用到了一些前面讲述的SQL语法,当然,这个SQL的业务场景需求我就不再赘述了,因为原本的SQL已经被我大批量的用新随便定义的表名和字段给替换了,目前已经面目全非了 , 毕竟不能暴露公司的一些业务的东西吧 , 之所以粘出来还是想实际的介绍下我前面那14条是怎样的结合着嵌入到一个SQL中的,随便看看就好 , 不需要深究其意思 。
2.Presto/Spark/Mapreduce 计算引擎对比? 平时一直使用大数据平台进行一些数据的处理 , 在执行查询语句时,是可以选择使用Presto,Spark,MapReduce不同的计算引擎进行工作,坦白讲 , 初次接触时也没搞明白它们的区别是什么,只知道有些SQL放在Presto引擎上执行准报错,但是放在Spark上就不会报错 , 它们的语法还是有差异的,presto没有spark内嵌的函数多 。据数据前辈给交接介绍时,大致就说,如果是单表查询,查询一些单表的数据量,聚合分组诸类,就使用Presto,相对来讲是比较快的;但是要同时使用到多个大数据表查询,那就使用Spark和MR是比较快些的;另外,Spark和MR相比,Spark运算速度应该有一些优势,但是遇到了特别特别大的计算量级时,资源再不够用 , 那么可能就会发生一些job abort,time out等比较让人牙疼的报错,毕竟这些报错不是由于SQL本身的编写出现的问题,而是和资源不够用相关,而且往往出现这个问题都是发生在SQL运行很久之后,记着我刚接手大数据没一个月时,曾经写了一条SQL执行了三个小时,最后给我了报了个time out , 气得我没把键盘摔了!反过来看,使用MR的话好像很少会发生以上陈述问题,它可能会慢些 , 但它最后一定会不辱使命帮你执行完毕 。
2.1 Presto? Presto我讲不了特别深,毕竟我平时对于它的使用也仅仅是选择了这个引擎,然后执行了我写下的单表执行的SQL,不过有一点可以确定,他对你填写的类型的要求是苛刻的,比如假设你定义了一个字段叫做user_id,给定的它的类型为string(不是误写,在hive中就是定义为string,你可以理解为mysql中的varchar类型),于是你写了一条SQL:select * from demo_db.demo_user where user_id = 1001,那么它对于presto引擎执行那将会报错的,因为他检查语法时会发现你输入的1001是个整型数值 , 和string类型不匹配,但是对于Spark引擎执行时就不会出这个问题,我觉得Spark底层应该是对1001做了转化,将这个整型数值1001转化为了字符串‘1001’ , 故可以去做正常的查询 。下面我将整理几条关于Presto的介绍吧放在这里,也是我从各类网站中了解来的,可能对实际开发用处不大 , 但起码我们知道自己用了个什么计算引擎吧 。

推荐阅读