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

ava通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦。比如分组、过滤、排序等计算,用java来实现都比较复杂。集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成。下面我们通过例子来看一下具体作法。

HDFS中的文本文件employee.gz中保存了员工数据。我们要读取员工信息,从中找出198111日(含)之后出生的女员工。文本文件在HDFS中以gzip方式压缩,并且无法一次装入内存。

文本文件empolyee.gz的数据如下:


实现的思路是:用Java程序调用集算器脚本,读取和计算数据,之后将结果以ResultSet的方式返回给Java程序。

首先,要在集算器的集成开发环境中编写和调试程序,准备工作是将Hadoop核心包配置包复制到“集算器安装目录\esProc\lib”中,如commons-configuration-1.6.jar、commons-lang-2.4.jarhadoop-core-1.0.4.jarHadoop1.0.4

由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的过滤HDFS文件中的数据。例如,我们需要查询198111日(含)之后出生的女员工,esProc程序可以从外部获得一个输入参数“where”作为条件,如下图:

where是个字串,取值是:BIRTHDAY>=date(1981,1,1) && GENDER=="F"。

esProc代码如下:

1:定义一个HDFS文件对象游标,第一行是标题,字段分隔符默认是tab。压缩方式由文件后缀决定,这里是gzip格式,集算器也支持其他压缩方式。UTF-8是字符集,缺省使用jvm的字符集。

A2:按照条件过滤游标。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER=="F")

A3:返回游标。

过滤条件发生变化时不用改变代码,只需改变where参数即可。例如,条件变为:查询198111日(含)之后出生的女员工,或者NAME+SURNAME等于”RebeccaMoore”的员工。Where的参数值可以写为:BIRTHDAY>=date(1981,1,1) && GENDER=="F" || NAME+SURNAME=="RebeccaMoore"。

Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx,并把HDFS需要的Hadoopjar包放到javaclasspath中):

//建立esProc jdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc 程序(存储过程),其中testdfx的文件名

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");

//设置参数

st.setObject(1," BIRTHDAY>=date(1981,1,1) && GENDER==\"F\" ||NAME+SURNAME==\"RebeccaMoore\"");//参数就是动态的过滤条件

//执行esProc存储过程

st.execute();

//获取结果集:符合条件的员工集合

ResultSet set = st.getResultSet();


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值