Metadata操作手册
1. Metadata基础知识
1.1. 专业术语(元数据)
1.1.1. 公共仓库数据模型
公共数据仓库模型是一种规范标准,限定了数据仓库、商业智能、知识管理、端口(portal)技术之间交换的元数据的格式。Pentaho元数据模型符合公共数据仓库模型标准,需要更多信息,请参照CWM™ Resource Page
1.1.2. 域(domain)
元数据域是pentaho的一个词,代表了在元数据层创建、存储、使用的业务对象。一个域可以是一个或多个的连接、模型、安全信息,业务视图、目录(categories)、表中的列以及概念(concepts)构成。你可以用pentaho元数据编辑器创建、保存多个pentaho元数据域。
Pentaho BI服务器通过一个metadata.xmi文件访问一个元数据域,这个元数据域文件被放在pentahosolutions 目录下。我们可以在pentaho solution文件夹下建立子文件夹,把metadata.xmi文件导出到这个子文件夹。注意不要改变为其他的文件名,比如test.xmi,否则这个xmi文件即使能在report designer中顺利预览报表,在pentaho server中也是无法成功运行报表的,这是因为pentaho server的某个配置文件限制了只会去寻找metadata.xmi文件,其他名字的文件系统会找不到,导致打开report报错。
1.1.3. 连接(connection)
连接表示了和数据库的连接信息,处在数据库中所有实体表、实体列的最上层。Pentaho元数据模型能够通过jdbc和几乎所有的关系数据库相连。
1.1.4. 实体表(Physical Table)
实体表是一个和数据库表直接映射的表信息对象。
1.1.5. 实体列(Physical Column)
实体列是一个和你的数据库表的列直接映射的列信息对象。
1.1.6. 业务模型(Business Model)
一个业务模型包括所有的逻辑、抽象业务对象和通过一定方式形成的实体数据库对象之间的关系。那种方式保证了实体数据库对象可能的变更对你的业务、业务程序、最终用户影响最小。在一个单个的域中能有多个业务模型。一个业务模型目前只支持一个数据库连接,它由业务表、关系、和一个业务视图构成。
1.1.7. 业务表(Business Table)
业务表是实体表的逻辑表示。这些业务表模型形成的层次把你的应用、用户和数据库的变化隔离开了。这些业务表模仿你的实体表,所以当数据库改变时,你只需要业务层次上的元数据模型,而不用去更改数以百计的那些当初用户依赖数据创建的报表、仪表盘、转换等
1.1.8. 业务列(Business Column)
业务列是实体烈的逻辑表示。更多细节参照业务表。
需要注意的是业务列的“父亲”可以是业务表也可以是业务类。尽管他们的“父亲”不同,他们表示的依然是相同的实体列,但这样做有不同的目的,如果业务列是业务表的孩子,它有点像模仿实体列的角色,起的作用是展示和业务表的关系(比如主键和外键);如果业务列是业务类的孩子,它代表能给用户最终使用的列。
1.1.9. 业务关系(Business Relationship)
业务关系描述两个表之间的关系,这意味着关键键值列在两表之间匹配,如1:1, 1:N, N:N关系,对所有有这种关系的模型表业务关系都需要定义,在选择join方式的时候,系统会自动带出关系类型,经过测试,带出的默认关系是正确的,不需要更改。
1.1.10. 业务类(BusinessCategory)
业务类表示的业务列的逻辑分组,需要注意的是向某个业务类中添加的业务列可以来自多个不同的业务表。即使你可以从一个业务表创建一个业务类(一种常见的例子),但一个业务类和业务表没有任何关系。业务类主要是用来重新组织业务列,使那些让用户觉得独立的,互相联系不紧密的业务列按照某种逻辑进行分组,使得用户使用元数据时更加清晰明了。
1.1.11. 业务视图(Business View)
业务视图是业务类的集合,表示你的模型的视图,主要供最终用户使用。每个模型有且仅有一个业务视图。业务视图是由一组业务类和业务列按照逻辑构成的,这种逻辑是和你的组织结构和终端用户相关的。
1.1.12. 属性Property(Properties)
属性表示你将详细描述的元数据的特征。一个属性有一个标识(实际是map的键)和一个值。举个例子,“font”是标识,它的值是“arial”
1.1.13. 概念(Concept)
概念是属性的集合,是你想运用在一个特殊业务对象(比如业务列和业务表)的特征的映射,这个特征可能包含一个到多个属性。
每个业务对象(实体表、业务表、列等等)都有自己的概念,其中的属性可以改变,覆盖其继承的概念或“父概念“中的属性。
根据这个对象和它处的模型层次,一个业务对象可以有一个、或者没有继承概念。更多细节,参阅模型的继承和层次。回顾参阅metadata business modeloverview.
概念也可以是一些业务对象的继承定义,可以通过层次的继承方式,以更好地组织管理你的元数据。除此之外,还有一种独立的“父概念“可以应用到一个或多个业务对象。
1.1.14. 父概念(Parent Concept)
一个父概念是一个独立的定义,是你可以运用到业务对象的可重用的概念。尽管每个业务对象有它自己的属性集合,你仍可以用一个父概念来向业务对象添加一个预先定义的额外的属性集合。如果父概念的属性和业务对象自己概念的属性有交叠,那么业务对象自己概念的属性具有优先级,会覆盖父概念中的属性。设置父概念,请点击tools->concept editor,在设置完父概念之后,只要右击任何一个对象,选择set parent concept,就可以将父对象所设定的属性集合加入这个对象的属性集中了。
1.1.15. 继承概念(InheritedConcept)
继承概念是从相关的业务对象复制派生出的一个业务对象的属性集合。比如,一个业务列和一个实体列相关,那么这个业务列继承实体列的所有概念及属性。概念间的优先级是:对象自己的概念>继承概念或者父概念。更多细节参阅模型层次和继承,回顾参阅metadata model overview.
1.2. 元数据业务模型概述
1.2.1 Introduction
Pentaho元数据编辑器是构建pentaho元数据域和模型的工具。一个pentaho元数据模型是你的数据库实体结构映射的逻辑业务模型。这些映射被集中存储在元数据资源库,允许管理员作如下事情:
对复杂的模糊的数据库表创建业务语言的定义。降低由于底层数据库改变引起的影响和变动。设置安全参数以限制用户报表访问以及数据过滤。对文本、日期、数字等数据格式化以提高报表的稳定性。依据用户的地域性设置把信息本地化。
元数据业务模型是pentaho元数据域中一个主要的组成部分。pentaho域囊括了数据库对象的实体性描述和逻辑模型(业务模型),以及数据库的抽象表示。下面的这些文字的目的是给用户明白的展示一个pentaho域和他包含的各部分组件的关系,进而充分的理解业务模型的作用。
下图详细的阐述了业务对象和pentaho元数据域的关系。
在这幅图中箭头的方向以及业务对象的颜色都是很有意义的。
每一个独立的业务对象有它自己的颜色,这包括pentaho域中主要的业务对象:连接、实体表、业务表、实体列、业务列以及分类。
图中描述的两种关系是理解pentaho元数据的关键。
继承是两个不同的业务对象,其中一个继承另一个的元数据,继承者具有被继承者的元数据。继承关系的一个例子是业务表从相关的实体表继承元数据。
第二种关系是相同对象关系,两个业务对象实际上是相同的只是以一种不同的方式表示或者是一个对象的复用。在抽象业务层的业务列和业务视图中的业务列的关系就是相同对象关系。
1.2.2 The Physical Layer
一个pentaho域的实体层包括连接、实体表和实体列。这些对象代表了你正用元数据建模和细化的数据库。实体层并不被认为是业务模型,因为不是所有在实体层定义的连接都会在每个业务模型中用到。
现在,多个业务对象模型可以在一个pentaho域中被创建,但是这些模型必须有一个且仅有一个相关的连接。这意味着你还不能在一个相同的模型中从两个不同的连接混合或匹配实体表。我们意识到这样会使模型不能支持多数据源,还严格限制了pentaho元数据编辑器允许表改变连接的能力,比如以后要从一个设备转移到产品数据库的需求。幸运的是你可以通过手工编辑对应的xml文件方式摆脱这种困境。记住这些特征对我们很重要,而且一直是实现原数据的目标。
1.2.3 The Abstract Business Layer
抽象业务层在元数据业务模型中是极其重要的。在抽象业务层中,包括业务表、业务列和关系。
你可以为任何你已经在实体层定义的实体表创建业务表,也可以对一个相关的实体表创建多个对应的业务表。这个规则同样适用于业务列。这对于复杂、模糊、安全性要求比较高的数据这样做是非常有用的。
业务表保持了对实体表的一个参照,这样允许他们之间是一种元数据继承关系。
如果实体表定义了一种元数据,那么业务表也就继承了这种元数据,除非业务表的自己定义的元数据覆盖了它。
接着是关系,请不要混淆这个词,这里的关系不是pentaho域中描述的关系,这种关系是业务表的映射关系。一个例子是,顾客和订单表之间是一对多的关系。在抽象业务层确定的表或列的关系,在实体层是不能区分的,这就是元数据关系的作用。可以举个例子,预算、实际销售、和销售数量,用一个有公式的业务列来指定你的业务规则。
1.2.4 The Business View
业务视图是业务模型的一部分,应用程序将对它操作,终端用户也将看见它。业务视图不过是一个“buckets”(叫分类),因为你可以重新排列、组织你的业务列使它对数据的用户更有意义。
在业务视图中,你可以创建任意数量的分类,在这些分类上重新排列你的业务列,但是最好符合你的业务。可以从不同的业务表抽取、混合数据,甚至对不同的分类添加多个业务列。业务视图唯一的限制是不能对同一个分类添加相同的业务列。
1.2.5 Incorporating Metadata
在pentaho域的每一个业务对象都有元数据与它关联。在pentaho术语中,一个元数据属性的集合叫做概念。
每个业务对象有三个层次的概念,它本身(自身或孩子概念),父概念,继承概念。业务对象在所有这三个层次上定义的元数据属性的集合对应用程序和用户都是可以用到的。当在相同的元数据属性上定义多层概念时,理解覆盖是很重要的。
当一个业务对象给自身设置一个元数据属性时,而相同的属性在父概念或者继承概念也有,那么设置的自身属性会覆盖父概念或者继承概念的相应属性。继承概念和父概念之间的优先级对于不同对象结果不同,使用时查看一下对象的属性就能简单地找出规律。
2. Metadata工具使用
2.1. 下载并启动metadata
2.1.1 下载
从http://sourceforge.net/projects/pentaho/files/Pentaho%20Metadata
下载metadata edit工具,本文档以“pme-ce-4.8.0-stable”为例讲解,下载后如图所示:
2.1.2 安装
Metadata editor使用需要满足两个条件:
1. JRE,至少安装1.5版本以上的JRE,并配置bin目录到系统路径。
2. Pentaho BI Server 可用,BI服务是在元数据发布时使用。
以上两个条件准备完毕后,
将上图压缩包解压后,进入“/pme-ce-4.8.0-stable\metadata-editor” 目录下,windows系统双击“metadata-editor.bat”启动Metadata editor,linux系统双击“metadata-editor.sh”启动。
如图所示:
启动成功后主界面如下图所示:
2.2.创建一个domain
2.2.1 创建一个domain
1. 新建
单击“File”-“New”-“Domain File…”创建domain,如下图所示:
2. 保存
单击“File”-“Save”保存domain,在弹出的对话框中输入domain的名字,如下图所示:
3. 删除
单击“File”-“Delete Domain”在弹出的对话框中选择要删除的domain,如图所示:
如上图所示删除BI_hxecp2,在弹出的是否确认删除的对话框中若确认删除点击“是”,否则点击“否”如下图所示:
2.2.2 新建一个数据库连接
新建数据库连接两个方法:
1. 单击“File”-“New”-“Connection…”创建Connection
2.右击Connections图标,点击“New Connection…”
在弹出的databaseconnection的对话框中填好信息并test成功后,点击“OK”,本例以mysql数据库为例子,如下图所示:
在连接的options选项加上编码格式,防止出现中文乱码,如下图所示:
2.2.3 导入实体表和列
导入实体表:
方法一:
1.创建数据库连接后,会自动弹出所连接的库中所有的表,选择所要导入的表,如图所示:
方法二:
2.右击数据库,点击“Import tables…”可导入想导入的实体表,如下图所示:
编辑实体表:
右击实体表,点击“Edit”,在弹出的对话框中可以对表进行添加列、删除列、表和列字段属性进行设置,如下图所示:
1. 添加属性
添加表属性,先在“subject”中选中表,然后点击“Available”右边的加号图标,添加想要添加的属性。如图所示:
点击加号后弹出添加属性对话框,以添加“Metadata Security”为例,如图所示:
成功添加后,如下图所示:
同理,为列添加属性,先选中列,然后同表操作一样。
2. 修改字体
选中所要修改字体的列,选择font属性,点击“change”,在弹出的对话框中修改成自己想要的字体,这里一定要注意,若某个字段值包含中文,一定要修改为中文字体,否则在前台报表展现时会出现乱码,如图所示:
在弹出的下列对话框中修改字体属性:
一般情况下,如果不是对某个字段进行特殊定义字体类型,我们可以用concept edit统一管理公用的配置。设置步骤:
打开TOOLS----点击concept edit,如下图所示:
在弹出的属性框中设置公用的属性,例如我们取一个名为Base的concept,如下图所示:
在实体表和物理表继承Base,如图所示:
继承后的字段属性样式都和Base设置的一致,如果某些字段特殊,那么可以不继承Base。
选中不继承Base的字段,右击选择”clear parent concept”即可。
同样如果再改成继承Base,则选择”set parent concept”即可。
3. 设置聚合类型
选择“DefaultAggregation”,“OptionalAggregations”属性,可以选择要聚合的方式,根据info center,目前该功能对ad-hoc查询无法实现,如下图所示:
Default Aggregation:在报表中添加该字段时默认的聚合方式。
用法:按报表中除聚合字段外的字段进行分组,然后对聚合的字段进行聚合。
Optional Aggregations:在报表中添加该字段时可以选择的聚合方式。如下图所示:
4. 添加新列
如果一个列需要在原有列基础之上进行函数转换或者计算等,可添加一个新列,然后用formula进行处理,例如:
dataTime本来是日期类型的,现在需要修改成“YYYY-MM”格式的,则我们可以添加一个新列,比如添加一个列名为date_month的列,然后在“formula”属性对列值进行定义,如下图所示:
聚合或者经过函数处理的字段一定要在实体表上如上图所示新加列,不能在原有的字段上进行formula重写,否则如果所要修改的字段在关系中用该字段作为关联条件,转换的时候会转换错误,如下图所示:
而用新添加的列进行关联就不会出现问题。
Pentaho metadata edit支持的函数及函数写法
Function Name | Parameters | Description | Example |
OR | 2 or more boolean expression parameters | Returns true if one or more parameters are true | OR( |
AND | 2 or more boolean expression parameters | Returns true if all parameters are true | AND( |
LIKE | 2 parameters | Compares a column to a regular expression, using "%" as wild cards | LIKE([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "%SMITH%") |
IN | 2 or more parameters | Checks to see if the first parameter is in the following list of parameters | IN([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "Adam Smith"; "Brian Jones") |
NOW | none | The current date | NOW() |
DATE | 3 numeric parameters, year, month, and day | A specified date | DATE(2008;4;15) |
DATEVALUE | 1 text parameter "year-month-day" | A specified date | DATEVALUE("2008-04-15") |
CASE | 2 or more parameters | Evaluates the first, third, etc parameter, and returns the second, fourth, etc parameter value | CASE( |
COALESCE | 1 or more parameters | returns the first non null parameter | COALESCE( |
ISNA | 1 parameter | returns true if 1st parameter is null. Otherwise, false. | ISNA([BT_CUSTOMERS.BC_CUSTOMERS_LAST_LOGIN]) |
支持的运算符:
Operator | Description |
= | returns true if two expressions are equal |
> | returns true if first expression is larger than the second |
< | returns true if first expression is smaller than the second |
>= | returns true if first expression is larger than or equal to the second |
<= | returns true if first expression is smaller than or equal to the second |
<> | returns true if two expressions are not equal |
+ | adds two values |
- | subtracts two values |
* | multiplies two values |
/ | divides two values |
支持的聚合函数:
Function Name | Description |
SUM | sums a specific columns values determined by grouping |
COUNT | counts a specific columns values determined by grouping |
AVG | averages a specific columns values determined by grouping |
MIN | selects the minimum column value determined by grouping |
MAX | selects the maximum column value determined by grouping |
实体表设置好属性以后,下面的业务表、视图默认继承实体表的属性。
2.2.4 创建业务模型
一个domain可以创建多个业务模型,可以设计成一个报表一个模型,或者多个报表一个模型。
模型中只需要添加需要的表即可。
创建业务模型方法一:
单击“File”-“New”-“Business Model…”创建Business Model,如下图所示:
方法二:
右击Business图标,点击“New Business Model…”
在弹出的对话框中,选择connection.并设置需要修改的属性。
2.2.5 创建业务表和列
右击BusinessTables图标,点击“NewBusiness Table…”
在弹出的对话框中选择要添加的表,如下图所示:
点“OK”后,业务表和列就创建成功了,如下图所示:
可以重写业务对象的属性,默认继承实体表和实体列的属性。
2.2.6 在业务表之间建立关系
右击Relationships图标,点击“New Relationship…”
在弹出的对话框中设置业务表之间的关系,如下图所示:
如果一个表连接另外两个表的结果集,则最上面的关系是最外层的,层次关系的控制通过改动时间控制,即最后编辑的关系为最外层关系。例如下图中最晚时间编辑的DIM_ORG_POSITION_MEMBER和DIM_ORG_PARENT表是最上面的一层关系,DIMENSION_DATE和DIM_ORG_POSITION_MEMBER表是最下面的一层关系,即:DIM_ORG_PARENT连接DIMENSION_DATE和DIM_ORG_POSITION_MEMBER的结果集:
如果是多个条件关联,选择ComplexJoin,在complex JoinExpression框中写表达式,格式为:
[BIZ_TABLE_A.BIZ_COL_A]=[BIZ_TABLE_B.BIZ_COL_A];[BIZ_TABLE_A.BIZ_COL_B]=[BIZ_TABLE_B.BIZ_COL_B]
例如:
2.2.7 创建业务视图
右击BusinessView图标,点击“NewCategory…”
右击BusinessView图标,点击ManagerCategory,在弹出的对话框中可以对Category进行添加Category、添加列、移动列的位置、删除Category和列等操作。
也可以把左边三个表合为右边一个cagegories,只取前台报表要用到的列。
做完以后可以用queryeditor测试一下是否正确。
点击query editor按钮,如图所示:
在弹出的对话框中设计报表
2.2.8 元数据的安全
Metadata可以控制数据权限。
点击菜单栏中的“Tools”-“Security”
在弹出的对话框中,输入服务器地址、用户名和密码,如下图所示:
点击“test“显示如下图证明连接成功,就可以将pentaho server中的role和user信息读入PME中:
然后双击某个业务模型,在打开的对话框中设置数据权限,Metadata Security控制用户是否可以访问基于这个元数据所做的报表,注意,在其中必须要添加某个希望可以访问元数据的角色,否则除了admin角色的用户可以访问这个元数据外,其他的用户在打开报表时都会报错。
注意以下两点:
1. 经过测试,Metadata Security是基于role而不是user来控制权限的。如果只设置了user的权限,而没有加入role的权限,那么在服务器中打开报表还是报错。
2. 实体表层可以不配置Metadata Security。在业务模型和业务视图层都必须配置Metadata Security,缺一不可,否则非admin的role就会打不开报表。
Metadata Security设置:
点击绿色的加号按钮可以添加一个角色或者用户,点击红色的x号按钮,可以删除选中的角色或者用户,如下图所示:
选择角色
Data Constraints是控制行级数据权限的。
Data Constraints设置:
None:允许所有数据通过
Global Constraint:
返回当前角色或者用户,当角色或者用户为预先指定的角色或者用户时,就可以访问所有数据,否则不能访问任何数据。
USER():返回当前用户
ROLES():返回当前角色
例子:IN("test";ROLES()),这表示如果登陆用户的role是test,才可以访问数据,其他role的用户登陆系统后不能看到任何数据。
Roles Based Constrains:
可以限制某个角色所能访问的数据,此处只能限定角色的数据,不能限定用户的数据
格式:business_table.business_column]= value
例如:角色为zy的用户只能访问四川省资阳市的数据,省provincename为四川,城市city为资阳市,写法如下:
点击“OK”后,如下图所示:
注意:如果过滤的数据列值是中文的,那么不能写汉字,需要把汉字转化成ASCII才可以,否则会报错。
Data Constraints只需在model上控制即可。
2.2.9 导入和导出Domains
导入:
点击“File”-“Import from XML File”
在弹出的Warning中,点击“是”
然后打到需要导入的.xml文件即可。
导出:
在弹出的对话框中为Domain选择目录和起名字即可。
2.2.10 发布Domain到BI服务器
点击“File”-“Publish To Server”
在对话框中输入相关信息:
出现以下界面,证明发布成功。
2.3.在报表中新建Metadata数据源
2.3.1 新建Metadata数据源
设置数据源及查询信息:
查询设计器编辑:
报表支持JDBC方式和metadata方式混合型的,即参数可以一部分用JDBC,另一部分用metadata连接方式,或者参数用JDBC,主查询用metadata,这都是允许的。
2.4.常见错误
2.4.1 报表显示乱码
1.有中文时显示乱码,数据库连接已设置成utf8,在查询的时候中文能正常显示,在报表中则显示乱码。原因有可能是:在metadata中没有对有中文的字段进行字体设置,默认是arial,西欧语言,需改成中文GBK。
设置字体:
默认的是Arial字体:
修改后的字体:
未改前的报表显示:
改后的报表显示:
2.4.2 Error paring parameterinformation
在PRD中能预览,部署到服务器上则出现“Error paringparameter information”,这种错误有可能是metadata的Security和Data Constraints配置有问题。
2.4.3 聚合函数派生列
如果一个派生列需要聚合,则不仅需要在派生列的aggregations上加上聚合,还要在formule上写上聚合,如图所示:
需在以上两处设置,得出的结果才对,否则结果不对。