您的位置:首页 > 编程语言 > Java开发

Java中非数据库的结构化数据计算

2013-11-19 09:33 169 查看
在JAVA中,数据库计算的套路已经很成熟了,即通过SQL去实现。但是结构化数据并非只存在于数据库中,比如Txt/Excel/xml等也常用来存储结构化的数据。针对此类非数据库的结构化数据应当如何计算呢? 本文给出3种解决方案供参考:用JAVA API直接实现、转化为数据库计算以及通用的数据计算层。1、用JAVA API直接实现。 JAVA API的好处是可以细致的控制每一个计算步骤,观察每一步的计算结果,也不存在学习成本。
读取和回写Txt/Excel/xml的API都已经比较成成熟了,因此从技术能力上讲JAVA完全支持此类计算,尤其是简单的计算。但是这种方法不方便之处在于数据计算常用的算法JAVA并没有直接实现,包括分组、排序、排名、聚合、过滤等,程序员需要耗费大量时间和精力去手工实现。此外,这类计算往往还涉及到批量数据之间的集合运算和关系运算,或者对象之间和对象属性之间的相对位置的运算,实现这些计算的底层逻辑也非常费力。2、转化为数据库计算。 把非数据库的数据导入数据库中,最常见的是使用ETL工具,如Datastage、DTS、informatica、kettle等。这种做法的好处是运算效率高,运行稳定,程序员工作量小,适用于数据量大,性能要求高,计算复杂度中等的场景,尤其是在数据库和非数据库混合运算的时候,这种优势更加明显。 这种方式的缺点主要是前期ETL的工作量大,不易维护。非数据库的数据一般不能直接使用,往往需要对字段进行拆分、合并、判断,因此要书写大量的perl/js脚本对数据进行清洗和改造;而且数据一般会持续更新,因此脚本要考虑增量更新问题。另外,不同数据源的数据难以遵循范式,因此往往需要2级甚至3级ETL的过程才能使数据真正可用。在table较多的情况下,调度设计也是个问题,谁先加载,谁后加载,之间相隔多久,这些都是考验数据库管理员智慧的工作(事实上,ETL庞大的工作量远远出乎人的意料)。另外,因为要通过数据库做定时的中转,实时性也比较差。 在某些运行环境中,如出于安全或性能的考虑没有数据库服务,再比如大部分数据都是Txt/xml/Excel的情况。没有数据库,ETL就没有存在的价值,这时该怎么办?这就需要用到第三种方法:3、通用的数据计算层。 以R和集算器最具代表性。数据计算层是指独立于数据持久层和应用程序层之外,负责计算来自数据持久层的数据,并将计算结果返回应用程序层。JAVA的数据计算层主要是为了降低应用程序层和数据持久层之间的耦合性,分担它们的计算压力。 通用的数据计算层直接支持各类数据源,不仅支持数据库,也需要支持非数据库。它最大的好处是可以直接访问各类数据源,不存在实时性的问题。另外它可以方便的实现不同数据源之间的交互计算,比如DB2和Oracle之间,MYSQL和EXCEL之间。以往这类访问实现起来很不方便。 通用的数据计算层一般对结构化数据的计算更为专业,比如支持泛型,显式集合类型,有序数组,因此可以轻松实现较复杂的计算目标。这是ETL/SQL等常规工具难以轻松解决的。 这类方法的缺点主要在性能上,通用数据计算层都是全内存计算,数据量受限于内存大小。不过集算器和R都能直接支持hadoop,在分布式的环境中可以较好的支持大数据。 集算器和R主要的区别是:集算器直接支持JDBC输出,很容易和JAVA代码集成,另外它的IDE更容易使用,支持真正的调式,脚本写在网格中,可以通过格名直接引用以前的计算结果。R不具备这些特点,也不支持JDBC,因此集成比较复杂;但它支持相关性分析等模型分析,不用自己实现细节就能直接生成计算结果。R还可以支持txt/Excel/xml等更多的非数据库数据源,而集算器只支持前2种。另外R的低端版本完全开源,集算器是收费的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息