OBIEE Usage Tracking增强--使用Python深入分析OBIEE访问日志--逻辑SQL统计的问题补充

浏览: 2309

前一篇介绍了OBIEE逻辑SQL统计-基本的实现方法,见https://ask.hellobi.com/blog/seng/5662


实际使用上也有碰到些问题,这里也分享一下:

中文处理报错

碰到逻辑sql中有中文,报了以下错误

/pythontest/.pyenv/versions/3.5.1/lib/python3.5/encodings/ascii.py in decode(self, input, final)
     24 class IncrementalDecoder(codecs.IncrementalDecoder):
     25 def decode(self, input, final=False):
---> 26 return codecs.ascii_decode(input, self.errors)[0]
     27
     28 class StreamWriter(Codec,codecs.StreamWriter):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 in position 32: ordinal not in range(128)

这个主要是操作系统字符集设置有问题,在运行python脚本前设置一下环境变量即可

export LANG=zh_CN.UTF-8
unset LC_ALL

中文字符匹配问题

原来使用[a-zA-Z0-9_]  匹配任意字符,不过万一有中文,就存在问题,需要匹配unicode,

\u4e00-\u9fa5 就表示所有中文字符,改成如下即可

"[a-zA-Z0-9_ \u4e00-\u9fa5]

re compile导致的速度问题

我这里的访问日志数据还不少,我用了30万条记录测试了一下,使用re.findall(sqltext)要4-5分钟,我用IPython notebook一直在busy,改成compile模式

patten = re.compile(searchstring)
patten.findall(sqltext)

时间在1分出头一点

输出的排序

默认dict打印感觉随机的, 我希望能够按字段名排序,可以用如下代码实现:

def print_sortdict(sqldict):
    printabledict =  sorted(sqldict.items(), key=lambda d: d[0])
    for data in  printabledict:
        print(data[0],',',data[1])

匹配"table"."column"问题

实际上存在"table".column 或 table."column"的模式,需要使用or的匹配,例如

' \"[a-zA-Z0-9_ ]*\"\.\"[a-zA-Z0-9_ ]*\" | [[a-zA-Z0-9_]*\.\"[a-zA-Z0-9_ ]*\"'

下一步思考

  • NQ_SESSION的统计:实际上NQ_SESSION.variable也被匹配上了,已经可以统计,但是库变量还需要想办法
  • 重复计数问题: 一个字段在逻辑sql出现多次,目前会被多次计数
  • 和 报表、物理层的关联:  血缘关系这个是近期的最终目标了。
推荐 2
本文由 seng 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

好厉害的样子~
最近想整理一下现有项目,就实现了一下相关工具,希望对大家有用吧。

要回复文章请先登录注册