集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦。

使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量。下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期。数据如下:

ORDERID CLIENT SELLERID AMOUNT ORDERDATE
    1 UJRNP 17 392 2008/11/2 15:28
    2 SJCH 6 4802 2008/11/9 15:28
    3 UJRNP 16 13500 2008/11/5 15:28
    4 PWQ 9 26100 2008/11/8 15:28
    5 PWQ 11 4410 2008/11/12 15:28
    6 HANAR 18 6174 2008/11/7 15:28
    7 EGU 2 17800 2008/11/6 15:28
    8 VILJX 7 2156 2008/11/9 15:28
    9 JAYB 14 17400 2008/11/12 15:28
    10 JAXE 19 19200 2008/11/12 15:28
    11 SJCH 7 13700 2008/11/10 15:28
    12 QUICK 11 21200 2008/11/13 15:28
    13 HL 12 21400 2008/11/21 15:28
    14 JAYB 1 7644 2008/11/16 15:28
    15 MIP 16 3234 2008/11/19 15:28
    …

比上期是指用当期数据和上期数据进行比较,以月作为时间间隔,比如用4月份的销售额除以3月份的销售额,这称为4月份的比上期。同期比是指用当期数据和上一周期的同期数据进行比较,比如2014年4月份的销售额除以2013年4月份的销售额。因为Hive没有窗口函数,所以难以完成这个计算需求,必须编写嵌套的SQL子查询,而Hive对子查询的支持也不够完备,这个计算目标经常需要放在外部实现。集算器esProc则可以比较容易的实现,具体代码如下:

A1:使用定义好的Hive数据源,通过jdbc连接数据库。

A2:按时间段从数据库查询数据,begin和end是外部参数,比如begin=”2011-01-01 00:00:00″,end=”2014-07-08 00:00:00″(即当天日期,可用now()函数获取)。

A3:对订单按照年份和月份进行分组,并汇总求得每月的销售额。

A4:增加一个新的字段lrr,即按月比上期,其表达式为mAmount/mAmount[-1]。代码中mAmount代表当期销售额,mAmount[-1]代表上期销售额。需要注意的是,初始月份的比上期值为空(即2011年1月)。

A5:将A4按照月、年排序,以便计算同期比。完整的代码应当是:=A4.sort(m,y),由于A4本来就是按年排序的,因此只需按月排序就可以达到目的,即A4.sort(m),这样性能也高。A6: 增加一个新的字段yoy,即月销售额的同期比,其表达式为if(m==m[-1],mAmount/mAmount[-1],null),这表示月份相同时才进行同期比计算。需要注意的是,初始年份(即2011年)各月份的同期比为空。

A7:将A6按照年逆序月正序进行排序。需要注意的是,数据只到2014年7月为止。结果如下:

A8:关闭Hive数据库连接。

A9:返回结果。

在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):
    //建立esProc jdbc连接
     Class.forName(“com.esproc.jdbc.InternalDriver”);
     con= DriverManager.getConnection(“jdbc:esproc:local://”);
     //调用esProc 程序(存储过程),其中test是dfx的文件名
     st =(com.esproc.jdbc.InternalCStatement)con.prepareCall(“call test(?,?)”);
     //设置参数
     st.setObject(1,”2011-01-01 00:00:00″);//begin
     st.setObject(1,”2014-07-08 00:00:00″);//end
     //执行esProc存储过程
     st.execute();
     //获取结果集
     ResultSet set = st.getResultSet();

集算器访问Hive和访问普通数据库一样,配好Hive的JDBC即可,这里不再赘述。

时间: 2024-10-21 23:49:21

集算器协助Java处理多样性数据源之Hive的相关文章

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE

集算器协助java处理多样性数据源之MongoDB

MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join.group.函数.表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询.窗口函数等复杂SQL运算仍不支持.其他免费的jdbc drive就只能支持最基本的SQL语句了. 用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算.这里以join为例说明一下具体作法. MongoDB中的文档orders保存了订单数据,employee保存了员工数

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列 

集算器协助java处理结构化文本之数据读入

JAVA只提供了指定分割符等最基本的数据读入功能,而其他常见功能都需要自己从底层去实现,比如:按列名读入指定列.指定列的次序.指定数据类型.无分割符等等.JAVA实现这类功能虽然不难,但代码很繁琐,很容易出错. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件data.txt是tab分割的文本文件,有30个列,第一行是具有业务意义的列名,现在需要按列名读入这几列:ID.x1Shift.x2Shift.radio,并按业务公式“((x1Sh

集算器替代存储过程实现报表数据源

存储过程是SQL语句和流程控制语句的集合,常用来把一个复杂的计算目标分解为多个简单的计算步骤.虽然以复杂性换来了灵活性,但SQL语句固有的缺点仍然体现在存储过程中,比如:分步不彻底.数据无序.缺乏集合.缺乏引用,之前我们也分析过存储过程作为报表数据源的利弊,可点击这里查看. 集算器解决了存储过程的上述缺陷,降低了对开发人员的技术要求,是存储过程理想的替代工具. 报表例子说明 某电信产品厂商有一张报表,主要目的是分析优势产品的销售额.销量.环比等指标,其中优势产品的定义是"在每个州的销量均在前10

集算器用作Java结构化文件计算类库

有时我们不能使用数据库而采用文件系统存储数据,这时就需要自行完成基于文件的数据计算.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差.在网上有许多寻找用于文件计算的Java类库的问题,如: http://www.coderanch.com/t/561180/java/java/read-text-file-perform-operation http://stackoverflow.com/questions/9614112/how-to-sort-and-ar