Hadoop生态上的hbase&hive之报表
报文开发,主要是思维设计,具体功能由java开发人员开发成功后,我们只要需要增加参数,调节规划就可以了。想要多学,还要自学。
我理解的报表开发,天坑!!!不想多说。
报表~定义文件(Report.XML)和数据统计指标~定义文件(Index.XML)
例如红框里面这些数字就是,所说的维度(指标),我们设计响应的逻辑通过逻辑将各种的表通过SQL语言进行整合!!!数据表若超过一定量,一般是三张表,那就需要BDI(ETL)进行整合需要的部分,组合整合表,再设计响应的报文进行数据加载的方式!!!
本公司所做的报文,是合作方开发的框架,我们只需要进行傻瓜式的开发。
编写好了report和index我们需要上传测试环境,输入执行命令进行加载!!!!
第一步:
加载顺序,控制台开始执行的时候,检索report文件,找到相应的报文,开始检索是否创建定义的hbase表名称,若没有创建相应的hbase表,有,直接根据定义的主键创建key,根据检索指标模块,
根据维度名称赋值作为列名称(可一个可多个列,以逗号区分);
第二步:
根据输入的统计的开始时间和结束时间,若没有则设置UTC和执行开始时间做为结束时间。
按照编写的逻辑进行加载。
将处理的数据存放在hbase表中;
第三步:
通过编写DM将hbase数据以数组方式存放在数组中,通过界面一系列的逻辑,把数据展示出来;
======================详细分析============================
=====话单入库=====
数据入库(话单),是关键!
一系列的表一般是通过一个或者多个主键关联起来!例如,身份证,我们要入学,工作,旅游等等活动根本不相干,但是一个身份证就可以把这些活动产生的表关联起来!!!
关联的工具是ETL(BDI)一个表少的话有十几个字段,多的话上百个字段。某一个特定的目的不可能使用所有的字段,只是一部分!!!人为定义,蛋疼。。。
由于ETL是纯java开发出来的,里面的时间函数就是JDK上面的方法,常用的是calendar方法。处理数据,时间点数据不可能出现问题,出现问题的是时间段!还有周指标!!!下面介绍周指标。
hive中的时间函数weekofyear是从周一开始作为一周的第一天,我命名【中历】,而java是美国人开发的calendar是从周一开始做统计时间【西历】,这下bug出来了!!!我们需要统一,国际化需要,所以定义西历。这就需要我们自定义函数作为我们整理入库的分区字段【周】。
自定义函数又名为自定义jar包。
第一步:创建一个简单 的project项目,
第二步:创建package【com.function.conver】和文件user-defined.properties
第三步:创建一个class文件TimeConverWeeks.class
第四步:创建转换方法,
public static String weekofyearcalendar(Stringdata){
String getyears=data.substring(0,4);
int cyear=Integer.valueOf(getyears);
String getmonths=data.substring(4,6);
int cmonth=Integer.valueOf(getmonths);
String getdays=data.substring(6,8);
int cday=Integer.valueOf(getdays);
Calendar cal =Calendar.getInstance();
cal.set(Calendar.YEAR,cyear);
cal.set(Calendar.MONTH,cmonth-1);
cal.set(Calendar.DATE,cday);
int iweek =cal.get(Calendar.WEEK_OF_YEAR);
String weeksofyear = "";
if(iweek==1 &&cmonth==12){
weeksofyear =String.valueOf(cyear+1)+"0"+String.valueOf(iweek);
}else if(iweek<10){
weeksofyear =String.valueOf(cyear)+"0"+String.valueOf(iweek);
}else{
weeksofyear =String.valueOf(cyear)+String.valueOf(iweek);
}
return weeksofyear;
}
第五步:打开【user-defined.properties】编写一行代码
weekofyearcalendar=com.function.conver.TimeConverWeeks
第六步:打jar包存放在BDI上,创建自定义函数,加载在上面!!!
====================2016年11月21日, 星期一0:13:55,未完待续
自定义函数,可以 多值 整合 单值!也可以单值扩充多值【未采用,可以考虑hive中的集合类型struct存放!】
hive中的常用集合类
小知识点,作为一个分布式处理数据库,也是有集合类的,我接触的集合类有三种!!!
第一种,struct,struct('张三',‘李四’,‘王五’)
若struct存放2中情况的话可以使用 struct{first STRING,last STRING} 存放,获取时候直接是
(字段名称).first获取展示;
第二种,map 和 java基础一样具有 key_value。例如map('1','张三','2','李四','3',王五) 获取值则是
(字段名称).['2']获取展示;
第三种,看见过,没使用!Array('张三',‘历史’,‘王五’)它们这些元素引用上面的值(可以理解上面是主键)
这三种情况,出现的是:
struct 是常见在地址!!!江苏省南京市雨花台区软件大道188号
“address”:(
“省份”:“江苏省”,
“城市”:“南京市”,
“区域”:“雨花台区”,
“街道”:“软件大道”,
“编号”:“188号”
)
map 查看一下就是薪水占比,股权占比统计等等,
"company":(
"马云": .2,
"孙正义": .3,
"雅虎": .3,
"其他": .2
)
Array使用场景可以当做,数据库中的一对多;即公司领导人架构
“组员”:(
“默默1”,
“默默2”,
“默默3”,
“默默4”
)
这些组员公用一个领导,队长。。。
====================
报表开发核心:
对处理数据数量信息不能变动,但是可以扩充区别字段!!!
失误一:
select t1.id,
t1.id2,
t1.id3,
t2.wtime wtime,
t1.playtimes,
t1.useid
from lolgame.t_table_name_d t1,
(select t.* from lolgame.t_cdr_runtime_sys t
where t.wtime > '{STARTTIME}'
and t.wtime <'{ENDTIME}')t2
where 。。。。。。
上面简化 的部分,是我写错的样例!!!获取打游戏时间和用户指标;
系统加载时间表是每天获取一次,每天都是通过自定义函数转换另一个字段!!!
说明一个周数就会有七天日期;
通过这样明确的检索,导致数据量变成7倍,用户数distinct一下是不变的!但是时间是累加的,变成实际的7倍。。。
失误二:
还有就是随意拆分数据,未增加相应的字段明确是拆分数据。
例如,指标对打游戏跨天需要拆分统计,
通过ETL整合的时候我们需要拆分的数据,字段个数未变,拆分到数据库中,
我们统计次数的时候就会莫名其妙的多了一些次数!!!
正确的方法就是
增加一个字段进行区分,加上序列号
对于拆分的序列号不能变动,只能相同
posted on 2017-09-11 22:07 weizhang715 阅读(307) 评论(0) 收藏 举报
浙公网安备 33010602011771号