几个小技巧
1.collect_set
(Hive中collect相关的函数有collect_list和collect_set。
它们都是将分组中的某列转为一个数组返回,
不同的是collect_list不去重而collect_set去重。)
select student_id,score,concat_ws(",",collect_set(question_id))
from ex_exam_record group by student_id,score,question_id
==>
001 1 8523,8426
001 0.5 8574,8984
001 0 4756,8887
==>列转行
id 1 0.5 0
001 8523,8426 8574,8984 4756,8887
2.hbase 遍历exam:analysis 表 question 列族中的数据
scan 'exam:analysis',{COLUMN=>'question'}
//column来指定列簇名
3.HBase Shell 中遍历 exam:covid19_world 表中的前 10 条数据
scan 'exam:covid19_world',{LIMIT=>10}
4.hive建表如何跳过文件首行/末尾
tblproperties("skip.header.line.count"="1"); //跳过文件第一行
“skip.heaer.line.count” 跳过文件行首多少行
“skip.footer.line.count”跳过文件行尾多少行
5.case when 用法
case具有两种格式。简单case函数和case搜索函数。
--简单case函数
case sex
when '1' then '男'
when '2' then '女'
else '其他' end
--case搜索函数
case when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
更多详情请搜素相关博客casewhen用法解析
6.hive建表
时间戳的类型,最好使用bigint,数据字节够用,不hi导致结果报错
7.rdd
灵活使用元组,reduceByKey,相结合想过更棒,可以求出很多需要的需求
①统计每个国家在数据截止统计时的累计确诊人数。(9 分)
val rdd: RDD[String] =
sc.textFile("hdfs://192.168.195.20:9000/app/data/exam11/countrydata.csv")
rdd.map(x => x.split(",")).map(x => (x(4),x(2).toInt)).reduceByKey(_+_).foreach(println)
②统计全世界在数据截止统计时的总感染人数。(9 分)
println(rdd1.map(x => x._2).sum())
rdd.map(x => x.split(",")).map(x => (x(4),x(2).toInt)).reduceByKey(_+_).map(x=>(“world”,x._2)).reduceByKey(_+_).foreach(println)
③统计每个大洲中每日新增确诊人数最多的国家及确诊人数,并输出 20200408 这一天各
大洲当日新增确诊人数最多的国家及确诊人数。(9 分)
Rdd.map(x=>x.split(“,”)).filter(x=>x(3)==”20200408”),map(x=>((x(6),x(3)),(x(2).toInt,x(1).toInt,x(4)))).reduceBykey((v1,v2)=>if(v1._1>v2._1) v1 else v2).collect.foreach(println)
④统计每个大洲中每日累计确诊人数最多的国家及确诊人数,并输出 20200607 这一天各
大洲当日累计确诊人数最多的国家及确诊人数。(9 分)
Rdd.map(x=>x.split(“,”)).filter(x=>x(3)==”20200607”),map(x=>((x(6),x(3)),(x(2).toInt,x(1).toInt,x(4)))).reduceBykey((v1,v2)=>if(v1._2>v2._2) v1 else v2).collect.foreach(println)
⑤统计每个大洲每月累计确诊人数,显示 202006 这个月每个大洲的累计确诊人数
rdd.map(x=>x.split(","))
.filter(x=>x(3).substring(0,6)=="202006")
.map(x=>((x(6),x(3).substring(0,6)),x(2).toInt))
.reduceByKey(_+_)
.foreach(println)