写ETL的时候,偶尔会用到python-udf,虽然很简单,但是因为用的少,时间久了,就容易忘,因此在这里总结下。
简单描述下背景及代码的功能:
一些BI同事或者产品啊运营啊这些同事经常用到我们的数据同学开发的表,然后由于他们的sql写的比较挫,导致他们的执行时间过长。一旦这些耗时过长的sql中包含了我们组的表,那么就得把这部分时长累加到我们的平均时长中,既然如此,我们就把含有我们组的sql拎出来,然后从中解析出我们组的表,本着“谁开发,谁保护”的原则,由表的owner去推“别在写这么挫的sql了,能不能别坑我了。”
于是代码功能简言之:从sql中提取目标库的表,可能含有多个(有多少个就提取多少个),并且去个重。
先贴下代码:
#!/usr/bin/env python
# coding=utf-8
import sys
import re
pattern = re.compile('[(%20)|(%0A)](db_xx.\w+[^%])')
pattern_test = re.compile('[(%20)|(%0A)](db_test_xx.\w+[^%])')
def extractTblByExp(str):
if str.find('mart_shplat_test.') >= 0 :
return pattern_test.findall(str)
else :
return pattern.findall(str)
def extractTbl():
for line in sys.stdin :
cols = line.strip('\n').split('\t')
arys = distinctArray(extractTblByExp(cols[9]))
cols.append(arrayToStr(arys))
rs = []
for col in cols :
rs.append(str(col))