| 问题: |
扩展性
2. 前端数据校验技术
(难度五星 - ★★★★★)
五天内完成修改!
A. 代码表(CSV)数据导入
目前码表主要来源于两种格式的文件:Excel和文本文件,Excel中的数据通过BQ的"基于Excel做查询"和ETL功能,可轻松导入到数据库。但后者是非标准文本数据文件(Tabbed
Text、CSV等),一般通用产品都无法处理,只能手工规范格式,去处非法数据后才能处理。如果是一次性工作问题不大,但如果是经常性的工作,这样就很麻烦,并且增加了手工操作出错的风险。
BQ新版本增加了处理该类非标准格式文本数据的通用方案,能自动识别数据正确处理。
数据格式如下:(虚假数据)
core_data_export v5
encrypt:yes
select dw_m1,dw_x4,dw_i9,kfc_p4,verify from
check_data
49844 产品A 42307 49056 6749 -788
17912 产品B 11744 12967 1224 -4944
8233 产品C 3203 4767 1564 -3466
25936 产品D 22331 18427 -3904 -7509
3626 产品E 1118 1596 479 -2029
739 产品F 163 113 -50 -627
。。。
72990 产品R 91206 102951 11744 29961
117843 产品L 145061 131880 -13181 14036
9685 产品H 16182 7321 -8862 -2364
19306 产品P 25619 21270 -4349 1964
7786 产品Z 4385 5296 912 -2490
1032 rows
END_OF_DATA
|
这需要排除首尾几行额外的数据,在BQ新版本中增加了对该类型文本数据的处理,可以选择文本文件的开始行和结束行,对于码表的数据,可以选择以中部数据(中部的数据肯定是正式数据了)为基准,自动检测数据的开始行和结束行。如下图:

刷新该查询,即可将数据导入并生成数据集。每列的数据类型会按前100行为基准自动检测,但也可指定每列数据类型,如手机号码,自动检测为数字型,可指定为文本型。
通过BQ的ETL功能,可将数据集数据导入到Oracle、SQL Server等各种关系数据库。
B. 代码表(CSV)数据的修改与变动处理
当码表项目改变后,需要同步更新到数据库。BQ ETL能自动产生更新脚本,可将该脚本加入任务计划,定时更新,也可运行该脚本马上更新。只需将改变后的文本或Excel文件拷贝到指定的目录就可以了。
C. 数据的导入与校验 (样客户自行定义校验规则)
各地报考数据以与码表相同的文本格式上报,由NEEA经校验后加载到一个统一的数据库,如有非法数据,则需要逐行挑出,生成错误报告,返回上报地要求校核重报。传统做法是通过编程对数据进行逐一校验,编程工作量很大且不易维护。
利用BQ的动态代码与表达式技术,很容易做出一个支持自定义校验规则的模板,只需写出校验表达式,即可进行数据校验,一般的通用校验(通过VB函数和表达式能做到的校验)就不用编程,部分复杂校验(如身份证合法性校验)只需在_global_脚本中提供一个校验函数也就可以了,将编程工作量减到最小,而且非常容易维护。BQ既是一个功能强大而易用的BI产品,也是一个开发平台,可自定义或开发界面,也可编程,编程语言语法兼容VB。如下图:
无法直接写出校验表达式的校验算法,可辅以自定义函数解决,如身份证合法性校验:
校验表达式可写:CheckCid("%C8%"),即对第8列数据调用函数CheckCid进行校验,在_global_中实现该自定义函数CheckCid:
Public
Function CheckCid(ByVal cid As String) As Boolean
Dim nLen As Long
nLen = Len(cid)
If nLen <> 15 And nLen <> 17 And nLen <>
18 Then Exit Function
'*计算新身份证的校验位
- 身份证最后一位
If nLen = 18 Then
Dim nSum As Long, check_number As Long, check_char As String
nSum=Mid(cid,1,1) * 7
nSum=nSum+Mid(cid,2,1) * 9
nSum=nSum+Mid(cid,3,1) * 10
nSum=nSum+Mid(cid,4,1) * 5
nSum=nSum+Mid(cid,5,1) * 8
nSum=nSum+Mid(cid,6,1) * 4
nSum=nSum+Mid(cid,7,1) * 2
nSum=nSum+Mid(cid,8,1) * 1
nSum=nSum+Mid(cid,9,1) * 6
nSum=nSum+Mid(cid,10,1) * 3
nSum=nSum+Mid(cid,11,1) * 7
nSum=nSum+Mid(cid,12,1) * 9
nSum=nSum+Mid(cid,13,1) * 10
nSum=nSum+Mid(cid,14,1) * 5
nSum=nSum+Mid(cid,15,1) * 8
nSum=nSum+Mid(cid,16,1) * 4
nSum=nSum+Mid(cid,17,1) * 2
check_number = 12-nSum Mod 11
If check_number = 10 Then
check_char = "X"
ElseIf check_number = 12 Then
check_char = "1"
ElseIf check_number = 11 Then
check_char = "0"
Else
check_char = CStr(check_number)
End If
If
UCase(Right(cid,1)) <> check_char Then Exit Function
End If
CheckCid
= True
End Function
|
码值校验函数则相对简单,如课程码值校验函数如下:
Dim ds_kc As SunDataset
Public Function CheckCode_KC(ByVal code As Long) As Boolean
'从数据库查出全部课程码,放在全局数据集ds_kc中,为提高效率,校验完毕不关闭,供后续使用
If ds_kc Is Nothing Then
Set ds_kc = New SunDataset
ds_kc.CreateDataset "SELECT {NEEA}.DM_KC.Code FROM {NEEA}.DM_KC",
-1
End If
'检验指定码值是否能在结果集中找到
Dim nResult As Long
ds_kc.QuickFindRow 1, code, nResult
If nResult > 0 Then CheckCode_KC = True
End Function
配合BQ的动态文书功能,按预定的模板,可以自动生成错误报告或下发通知,如:

D. 批量数据的导入与校验
在模板中提供了批量数据导入与校验功能,指定一个目录位置,即可检索出该目录下的报考信息,并从代码表检索出地区中文信息,显示地区名方便选择处理。文件名按:BMxxyyy.txt
/ KSxxyyy.txt格式,xx为地区代码,yyy为年份与考次。按"批量处理所有文件",能对所有文件进行数据校验、聚合(生成中间表)、加载到数据库,并按地区逐个生成错误数据报告。
|
| 描述: |
两周内完成速度优化!由30分钟优化到10秒内完成查取同样数据,速度大大提升。我们的卖点不但是产品,还有专业的服务支持团队。

问题:
1. 事实表(Fact Table)问题
在一个多维数据集,有且只能有一个事实表,而如果统计量度分别来自两个表,一般数据仓库难于处理。
2. 维度表处理问题
在Microsoft Analysis Service中构建多维数据集时,微软限制对维度成员数目的计算时间不能超过30秒(SP3后延长到3分钟)。所谓维成员计算,就是对该维成员对应的字段求DISTINCT
COUNT,这就限制了对于海量数据的事实表,维度不能直接来自事实表(对于上千万数据的事实表,DISTINCT COUNT某个字段会消耗很长时间)。
3. Oracle不支持自动分解日期字段问题
在建立多维数据集时,需要将日期分解为年、季度、月、日等不同级别,使用Microsoft OLE
DB for Oracle,可自动分解日期字段,但该驱动对于Oracle 9i以上版本支持有问题,而使用Oracle本身提供的Oracle
OLE DB Provider,又不支持自动分解日期字段。
4. 数据仓库完整性、正确性问题
数据仓库对数据的完整性、正确性要求很严格。
5. 日期条件值问题
日期维的处理,怎样智能地根据用户输入,转换为正确的日期维级别表达式的组合,并尽可能取最大级别以提高性能,最后实现多结果集的聚合汇总。
6. 增量更新问题
怎样将发证日期在2007年以前的作为一个分区,一次生成后,将不再改变?今年即07年,怎样每个季度或每个月作一个分区?每天晚上怎样更新最新分区的数据?
尚南专业数据仓库研发团队已成功一一解决以上问題。
环境与配置
数据源:Oracle 10g
数据仓库:Microsoft Analysis Service 2000
特性:
1) 以与关系型数据库相同的模式访问多维数据库,修改语义层定义后,原基于关系数据库的统计报表稍加修改甚至不修改,即可方便地转为多维模式
2) 扩展Microsoft SQL Server 2000多维数据库访问语言MDX(Multidimensional
Expressions),实现多维数据库的IN和BETWEEN条件操作符运算
3) 对于日期时间条件,可根据输入内容自动调整时间维及其级别的条件表达式,从而在一张报表实现高速的年报、季报、月报、日报等,如:
输入:2007 表示:统计2007年的数据
输入:200701 表示:统计2007年1月份的数据
输入:2007Q1 表示:统计2007年1季度的数据
输入:20070101 表示:统计2007年1月1日的数据
输入:20070101 ~ 20070205 表示:统计2007年1月1日至2007年2月5日的数据
。。。
|