python精确查找表名出现在那些hivesql中

注:技术交流可以加我VX:k-loop,昵称:默读者。

场景:当我们编写了一堆hivesql文件时,突然有一天发现其中使用的一张表不能用了,这个时候,需要将此表替换成新表,笨的方法是挨个查看每一个hivesql脚本。为解决此问题。开发了一个python脚本。

欢迎指导。

#-*- encoding:utf-8 -*-
#用途:从所有的HQL中检索输入的表名,看那些HQL使用了输入的表。
 
import os 
#FilePath= r"E:\svn\dw_project\TJ_DW" #检索此路径下的所有HQL文件
#FilePath=os.getcwd()
FilePath= str(os.getcwd())#此文件所在的绝对路径
#+"\\"+"TJ_DW"
print(FilePath)
print(os.walk(FilePath))
#+"\\"+"TJ_DW" #检索此路径下的所有HQL文
print("The TableName :") #提示输入表名
KeyString= input().lower() #将输入的表名全部转换成小写字符串
FoundFlag=False #是否找到标志位,初始化没有找到输入的表名
#os.getcwd() 
#rootdir = os.getcwd() 
pathname = '' #绝对路径初始化为空
lists = []#装载可能有重复值的HQL文件名的数组
lists_s = []#装载去除重复值的HQL文件名的数组
for (dirpath, dirnames, filenames) in os.walk(FilePath): #获得此路径下的所有文件的绝对路径,例如E:\svn\dw_project\TJ_DW\hql_tjzx\b_jmd.hql    
    #print(dirpath+"AAAA")
    for filename in filenames: 
        pathname=os.path.join(dirpath, filename) #将获得的绝对路径赋值给变量pathname
        #print(pathname+"BBBBB")
        if pathname.split('.')[-1]=='hql': #循环遍历,只检索hql结尾的文件
            #print(pathname+"CCC")
            FileObj=open(pathname,'r', encoding='UTF-8') #打开hql文件
            #print(filename)
            LineTmp = FileObj.readlines() #将hql文件里的每一行都转化为小写
            if len(LineTmp)>0 :#如果此HQL文件不为空时
                for line in LineTmp:
                    if line.find(KeyString) >= 0:#如果在某一行找到了输入的表名字符串时
                        for list in line.split('.'):#将这行代码按照.进行分割
                            if list.find(KeyString) >= 0:#分割后的字符串里还能找到了输入的表名字符串时
                                for list_s in list.split():#将这字符串在按照空格或者回车分割
                                    if list_s.find(KeyString) >= 0:#分割后的字符串里还能找到了输入的表名字符串时
                                        if len(list_s)==len(KeyString):#分割后的字符串的长度等于输入的表名字符串长度时
                                            #print("MMMMMMMMMMMMM")
                                            FoundFlag=True#认为找到了使用此表的HQL文件
                                            lists.append(filename)#将HQL文件装进数组里
                                            #print(lists)
                                            #print(filename)
                                            
            else:#HQL文件是空时
                FoundFlag=False#没有找到此表
            FileObj.close()#关闭
        pathname = '' #遍历完一个hql文件后,把绝对路径变量置空
#print(lists)
#下面是去除重复的HQL文件
if FoundFlag==True:#找到了使用此表的HQL文件时
    for i in lists:#遍历找到的所有HQL文件
        if i not in lists_s:
            lists_s.append(i)#把不重复的HQL文件装进另一个数组里
    #print(lists_s)
    print("表 "+KeyString+ "出现在如下HQL文件中:")
    for hql in  lists_s:#遍历不重复的HQL文件
        print(hql)#输出不重复的HQL文件
if FoundFlag==False:
    print("没有HQL文件使用 "+KeyString+" 此表。") #没找到,返回

 

-------------------------------------------

例如我的hql脚本都存在 E:\svn 下面的红框中的文件夹里,其实文件夹里还有文件夹,无论多少层文件夹,都可以找到,无需担心。只要确保所有的hql文件都是UTF-8编码格式就行,如果不是,容易报错。

在黑屏里运行python 脚本,回车

结果:

输入表名后回车,结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值