前一篇介绍了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出现多次,目前会被多次计数
- 和 报表、物理层的关联: 血缘关系这个是近期的最终目标了。