场景:当我们编写了一堆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 脚本,回车
结果:
输入表名后回车,结果