报表工具怎样使用 Hadoop 的数据

 

Hadoop生态系统由核心应用HDFS,以及外围应用HiveHBaseSpark等组成。具有官方JDBC接口的Hive是最容易被报表工具访问的,其他应用只提供了API接口,访问起来就困难多了。大部分报表工具只能在自定义数据集里调用API接口,代码非常繁琐;个别报表封装了API接口,简化了取数的过程,但没法简化计算过程,仍然需要大量硬编码。

更好的办法是用JAVA开源计算类库SPLSPLAPI接口封装为简单易用且语法统一的取数函数,不仅支持HDFS,也支持大量外围应用,既有强大的计算能力,还有易于被报表集成的JDBC接口。

SPL提供了方便易用的取数函数,支持多种Hadoop数据源。比如,HDSF存储了各类结构化文件,从这些文件读取数据:


A B
1 =hdfs_open(;"hdfs://192.168.0.8:9000")
2 =hdfs_file(A1,"/user/Orders.txt":"UTF-8").import@() //读取tab分隔的txt
3 =hdfs_file(A1,"/user/Employees.csv":"UTF-8").import@tc() //csv,首行为列名
4 =hdfs_file(A1,"/data.xls":"GBK").xlsimport@t(;"sheet3") //xls,从sheet3取数
5 =hdfs_close(A1)
6 return A2 //只返回A2

除了格式规范的结构化数据,SPL可以处理不规则的文件,以及多层的json\xml

HBase取数:


A
1 =hbase_open("hdfs://192.168.0.8",   "192.168.0.8")
2 =hbase_scan(A1,"Orders")
3 =hbase_close(A1)
4 return A2

Spark取数:


A
1 =spark_client("hdfs://192.168.0.8:9000","thrift://192.168.0.8:9083","aa")
2 =spark_query(A1,"select * from   tablename")
3 =spark_close(A1)
4 return A2

HiveJDBCAPI两种接口,后者性能更高。SPL不仅支持JDBC接口,也封装了API接口,用法如下:


A
1 =hive_client("hdfs://192.168.0.8:9000","thrift://192.168.0.8:9083","hive","asus")
2 =hive_query(A1,   "select * from table")
3 =hive_close()
4 return A2

 

SPL内置丰富的计算函数,可以用简单直观的语法计算取到的数据,从而避免繁琐的硬编码。比如对订单进行区间查询,其中p_startp_end是参数:


A
1 =hdfs_open(;"hdfs://192.168.0.8:9000")
2 =hdfs_file(A1,"/user/Orders.txt":"UTF-8").import@()
3 =hdfs_close(A1)
4 =A2.select(Amount>p_start   && Amount<=p_end)

SPL取数过程高度相似计算语法则完全通用,这里不再分开说明。

SPL提供了JDBC驱动,可以像普通RDB一样被报表工具集成。对于上面的SPL代码,先存为脚本文件,再在报表工具里以调用存储过程的形式调用脚本文件名。以Birt报表为例,可写作:

{call intervalQuery(? , ?)}

再举几例:


A B
3
4 =A2.select(Amount>1000   && like(Client,\"*S*\")) //模糊查询
5 =A2.sort(Client,-Amount)" //排序
6 =A2 .id(Client) //去重
7 =A2.groups(year(OrderDate);sum(Amount)) //分组汇总
8 =join(A2:O,SellerId;B2:E,EId)
  .new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept)
/关联

 

SPL还提供了标准SQL语法,可有效降低学习门槛,适合代码短难度低的计算。比如区间查询可以改写为下面的SQL语句:


A
1 =hdfs_open(;"hdfs://192.168.0.8:9000")
2 =hdfs_file(A1,"/user/Orders.txt":"UTF-8").import@()
3 =hdfs_close(A1)
4 $select * from {A2} where Amount>? && Amount<=?; p_start, p_end

更多例子参考在文件上使用 SQL 查询的示例

 

SPL最鲜明的特点是计算能力强大,可简化分步计算、有序计算、分组后计算等逻辑较复杂的计算,很多SQL难以实现的计算,用SPL解决起来就很轻松。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:


A B
1  /取数据
2 =A1.sort(amount:-1) /销售额逆序排序
3 =A2.cumulate(amount) /计算累计序列
4 =A3.m(-1)/2 /最后的累计即总额
5 =A3.pselect(~>=A4) /超过一半的位置
6 =A2(to(A5)) /按位置取值

 

SPL提供了专业的IDE,具备完整的调试功能,允许以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。

IDEpng

除了Hadoop之外,SPL还支持WebServiceRestfulMongoDBredisElasticSearchSalesForceCassandraKafka等多种数据源,以及不同数据源/数据库之间的混合计