使用 JOLAP 实现复杂分析查询

Shashank Tiwari 在本文中对 JOLAP 进行了简要介绍,它是一种标准规范,支持在 Java™ 企业平台上创建和操纵 On Line Analytical Processing (OLAP) 数据和元数据。

在过去几年, OLAP 逐渐成为处理数据仓库和商业智能使用的多维数据的流行方法。OLAP 服务器和应用程序随处可见,并且很多存储模式、查询机制和访问策略也已经被开发出来,以满足复杂分析查询的业务需求。JDBC API 一直被用作在 Java 平台上访问和操纵维度数据的一种代理机制,但是,使用 JDBC 会折损维度模式本身的优点。通常的做法是将 JDBC 与一个专用扩展结合使用,以弥补这一点。然而,这意味着只能局限于特定的实现。

本文的目的是向熟悉 OLAP 的 Java 开发人员介绍 Java OLAP (JOLAP) API。本文描述了它的核心组件和相关的包,并提供 JOLAP 查询和检索操作的一个例子。本文还简要地讨论 JOLAP 与 JDBC 之间的相似之处,以及 JOLAP 与用于多维数据的 XMLA 查询语言 mdXML 之间的关系。请从 参考资料 小节下载 JOLAP API 规范。

什么是 JOLAP?

Java Community Process JSR 69 计划为 OLAP 服务和应用程序创建了一种简化的同时又非常全面的统一 API。JOLAP 规范的目的是部署在 Java 企业平台中或者与之进行交互,它充分利用 Common Warehouse Metamodel (CWM),CWM 是以独立于供应商的方式定义逻辑 OLAP 结构的一个 OMG 标准。它还利用 Meta. Object Facility (MOF)、XML Metadata Interchange (XMI) 和 Java Metadata Interface (JSR 40)。(请参阅 参考资料,以了解关于支持 JOLAP 的这些技术和其它技术的更多信息。)

JOLAP API 从概念上分为 4 个部分:

  • 元数据接口和 XML:JOLAP 元数据接口是 CWM 的一个子集,包括针对特定于 JOLAP 需求的扩展。 JSR 40,即 Java Metadata Interface,简化了 OMG MOF 的 Java 语言映射,并被用于根据模型生成 JOLAP 接口。

  • Reflective 服务:JMI Reflective 服务使 JOLAP 可以进行自身检查并发现可用的元数据。当实现模型驱动的架构时,这些功能是最密切相关的。

  • 查询接口:查询接口由两个模型组成。JOLAP 的查询模型处理 OLAP 查询管理,它的源模型方便了特定于供应商的 OLAP 原语扩展的实现。按照规范的定义,源模型是 JOLAP 的一个可选功能。

  • 游标接口:JOLAP 的游标接口定义用于管理 OLAP 查询返回的多维结果集的功能。

下面的小节将深入讨论这些组件。

JOLAP 模型

JOLAP 模型是由一些相关子模型组成的一个 UML 模型。而包组成了模型的逻辑分组,从这一角度来讲,JOLAP 分为 6 个组:

  • 核心元数据由 CWM 元数据定义改编而来,后者以独立于供应商的方式定义 OLAP 元数据。

  • 资源模型定义连接和连接工厂,它们是基于 Java Connector Architecture Common Client Interface (JCA CCI) 的原则。资源模型不同于标准的 JCA 实现,因为它包括了 OLAP 风格的交互。

  • 查询模型定义维度选择、边界、立方体视图以及维度数据的聚合与操纵等概念。模型还包含了不对称和事务型特性。

  • 游标模型定义如何查看查询返回的维度结果集。

  • 源模型和服务器端元数据模型被定义为可选包。源模型提供对原语查询操作的支持;服务器端元数据模型定义面向部署的类使用的其他元数据。

连接到支持 JOLAP 的服务

根据 JOLAP API 规范,可以使用该 API resource 包中的类连接到支持 JOLAP 的服务,例如商业智能服务器和数据集市。这些类提供了 JCA CCI 的 InteractionSpec 架构以外的功能。

Connection 和 ConnectionFactory 是资源包中两个主要的类定义。ConnectionFactory 类用于获得一个 Connection。创建连接时,可以传递参数,也可以不传递参数。对于容器管理的登录场景,可以创建一个不需传递参数的默认连接。对于组件管理的登录场景,则必需使用参数来创建连接,这种情况下可使用 ConnectionSpec 创建连接。

Connection 表示到支持 JOLAP 的资源的一个活动连接,它包括的帮助器方法可以简化 OLAP 风格的交互。可以使用 Connection 执行元数据查找和查询操作。下面给出了两组功能以及定义:

  • 查询模式和相关对象:获得可用模式,设置默认模式,获得默认模式,以及访问与某个模式相关的维和立方体。

  • 创建查询对象:创建 CubeView、 EdgeView 和 DimensionView 对象。

Abortable、ResourceAdapterMetadata 和 ConnectionMetadata 类也被包括在资源包中:

  • Abortable 只有一个方法 abort(),该方法可用于取消一个长时间运行的操作。这种中断机制不是强制性的,不是所有的 JOLAP 提供程序都支持。

  • ResourceAdapterMetadata 提供用于获得与适配器名称、适配器供应商、适配器版本、规范名称、规范供应商、遵从性级别以及规范版本相关的数据的 getter 方法。JOLAP 规范定义了两种遵从性级别,它们的差别在于一个具有最基础的核心功能,另一个是具有可选功能的核心功能。

  • ConnectionMetadata 定义用于获得 EIS 产品名称、EIS 供应商和 EIS 用户名的 getter 方法。

    独立于供应商的 OLAP 元数据

    JOLAP 的核心元数据模型基于 OMG Common Warehouse Metamodel。 CWM 清楚地区分客户端元数据与服务器端元数据,客户机需要前者来查询 OLAP 资源,而 OLAP 服务器需要后者来处理客户机请求。JOLAP 规范采纳相同的区分方法,也提供了客户端元数据和服务器端元数据,客户机端元数据形成 OLAP 元数据的核心,而服务器端元数据为那些欲将实现建立在 CWM 模型基础上或者以 CWM 和 XMI 格式交换数据提供便利。现在,让我们将目光投向客户端元数据,这种元数据用一些附加扩展映射 CWM 客户端模型。本文在后面将简要地讨论服务器端元数据。

    Schema、 Dimension、 和 Cube 是三个最重要的元数据定义:

  • Schema 是 OLAP 模型的逻辑表示。它还被用作模型中所有元素的容器。

  • Dimension 是多维结构的一个纵坐标。它表示具有相同意义的一组惟一的成员或值。

  • Cube 是具有若干相同维的一组度量。一个立方体的每个数据点或单元是它的维成员的笛卡尔乘积。

核心元数据包中的其它类方便了维、立方体和模式之间的相互关联;帮助它们以结构化的方式组织起来;或者提供操纵这些对象所使用的 Member 等元素的机制。

可以使用各种帮助器类,以分层的方式组织维。LevelBasedHierarchy 用于仅根据级别或者同时根据级别和链接节点定义层次。ValueBasedHierarchy 用于根据拓扑结构定义层次。基于值的层次不考虑级别,因而可用于仅根据链接节点创建层次。

HierarchyLevelAssociation 用于建模 Dimension 的不同级别与它的 LevelBasedHierarchy 之间的交点。CubeDimensionAssociation 用于将一个立方体与它的维度相关联。

Member、MemberValue、MemberList、CurrentMember、MemberQuatifierType 和 MemberObjectFactories 用于存储、操纵、访问和创建存储在特定维中的惟一值的实例。其中像 Member 和 MemberValue 等既可以作为数据,又可以作为元数据,具有双重继承。

这些客户端元模型元素是从 CWM 元模型继承的。

多维查询

JOLAP 规范非常全面,它涵盖了查询模型、查询需求、格式良好性和查询事务模型。本文只对 JOLAP 查询模型作一个高度概括。请参阅 参考资料,了解完整的规范细节。

JOLAP 的查询需求和模型简化三种常见 OLAP 查询的创建和执行,即多维查询、边界查询和数据查询。

  • 维度查询是对单维度成员操作的成员选择。维度查询在 OLAP 的 Dimension、Hierarchy、HierarchyLevelAssociations 和 Level 属性级别上进行查询、过滤和排序。

  • 边界查询由一组单维度或多维度查询组成,从总体上描述结果集的坐标系统。

  • 数据查询表示立方体中的数据选择。

DimensionView、EdgeView 和 CubeView 是 JOLAP 查询模型中最重要的三个定义。可以组合这些表示维、边界和数据查询的基本查询类型,以建模更复杂的情况。

查询模型中其他重要的子模型与过滤和排序、计算成员、派生属性以及不对称选择有关。

可以根据简单或复杂的过滤器选择维度成员的子集。基于过滤器的中间选择具有相关的 setAction 操作。Initial 将选择的集合看作成员的初始集合。Append 将成员添加到列表的尾端。 Prepend 将成员添加到列表的开头。 Insert 和 Difference 根据 dimensionInsetOffset 属性添加成员,或者添加前一个集合中存在而当前集合中不存在的成员。另外,DataBasedMemberFilter 可用于根据数据表示的条件过滤维度成员。

JOLAP 包括三种类型的排序定义:基于成员属性的排序、基于成员层次的排序以及基于立方体数据值的排序。

计算成员是派生成员,它不在某一个维度上,而是从已有数据派生而来。聚合、组合之类操作的操作符可以是以成员、属性或常量作为输入的操作符。类似地,派生属性是临时的用户定义属性,是根据其他值得到的。

清单 1 显示了一个简单的调用,可以连接到 JOLAP 资源、查询该资源并检索数据:


清单 1. 查询和检索数据
                
....
env.put( Context.INITIAL_CONTEXT_FACTORY,
"com.company.javax.olap.resource.ConnectionFactoryImpl" );
....

// Get the ConnectionFactory from JNDI
javax.olap.resource.ConnectionFactory connFactory =
(javax.olap.resource.ConnectionFactory)initCtx.lookup("MyJOLAPServer" );

// Create a connection spec
javax.olap.resource.ConnectionSpec connSpec =
(javax.olap.resource.ConnectionSpec)connFactory.createConnectionSpec();
connSpec.setName( "some userId" );
connSpec.setPassword( "some password" );

// Connect to the JOLAP resource

javax.olap.resource.Connection conn =
(javax.olap.resource.Connection)connFactory.getConnection(connSpec);

// Get list of Dimensions
// and do something ....

List dimensionList = conn.getDimensions()
Iterator dimensionIter = dimensionList.iterator();
while ( dimensionIter.hasNext() )
{
javax.olap.metadata.Dimension myDimension =
(javax.olap.metadata.Dimension)dimensionIter.next();
....
....
}

// Close the JOLAP connection
conn.close();
}

....

操纵结果集

游标模型 API 与 JDBC ResultSet API 非常类似。游标模型天生就具备专用于维度结构的概念,而在关系场景中意义不大。实际上,维游标类似于 SQL 结果集,只是多了一些附加功能。RowDataAccessor 和 RowDataNavigation 接口定义 CubeCursor、DimensionCursor 和 EdgeCursor 类的大部分功能。

游标模型提供导航和管理 JOLAP 查询返回的结果集所需的类,例如清单 1 展示的类。它能提供对 OLAP 非常关键的多维透视图。 游标模型考虑了不对称和大型结果集的情况。对于大型结果集,考虑使用增量结果集访问。





回页首


可选包

面向部署的元数据

如前所述,服务器端元模型表示 CWM OLAP 元模型的面向部署部分。某些客户端定义也与部署相关。 Cube、Schema、HierarchyLevelAssociation 和 ValueBasedHierarchy 之类的客户端定义都被用于部署的服务器端类子类化。服务器端子类还引用与客户端类无关的实体。例如,服务器端子类 Schema 与 DeploymentGroup 之间存在关联,后者并不在客户端。 所有服务器端元模型定义都在 javax.olap.serversidemetadata 包中。

原语查询操作

模型是基于源对象 MetadataObject 的低级模型,具有根据 type、inputs 和 outputs 定义的特定结构。输入和输出本身可以作为源。源元素是具有标识符(一个惟一值)的一条记录和一组输出记录。当元素表示关系表中的一行或多维立方体中的一个单元时,源元素的定义就变得更加复杂。

源模型中还包括一组健壮的方法和模板。 join 方法可能是所有可用方法中最为重要的。模板是高级模型与低级模型之间的桥梁,当模板本身管理源时,可以修改立方体、边界和维度选择等高级对象。模板是有状态的,可以在任何时候修改。因此,当使用原语方法创建源时,源可以是动态的,而不是静态的。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13186779/viewspace-201831/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13186779/viewspace-201831/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值