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)    收藏  举报

导航