def executeSQLFile(filename):
with open(r'../sparksql_script/' + filename, 'r') as f:
read_data = f.readlines()
# 将列表的一行一行拼接成一个长文本,就是SQL文件的内容
read_data = ''.join(read_data)
# print(read_data)
# 将文本内容按分号切割得到数组,每个元素预计是一个完整语句
arr = read_data.split(";")
# 对每个SQL,如果是空字符串或空文本,则剔除掉
# 注意,你可能认为空字符串''也算是空白字符,但其实空字符串‘’不是空白字符 ,即''.isspace()返回的是False
arr2 = list(filter(lambda x: not x.isspace() and not x == "", arr))
# print(arr2)
# 对每个SQL语句进行迭代
for sql in arr2:
# 先打印完整的SQL语句。
print(sql, ";")
# 由于SQL语句不一定有意义,比如全是--注释;,他也以分号结束,但是没有意义不用执行。
# 对每个SQL语句,他由多行组成,sql.splitlines()数组中是每行,挑选出不是空白字符的,也不是空字符串''的,也不是--注释的。
# 即保留有效的语句。
filtered = filter(lambda x: (not x.lstrip().startswith("--")) and (not x.isspace()) and (not x.strip() == ''),
sql.splitlines())
# 下面数组的元素是SQL语句有效的行
filtered = list(filtered)
# 有效的行数>0,才执行
if len(filtered) > 0:
df = spark.sql(sql)
# 如果有效的SQL语句是select开头的,则打印数据。
if filtered[0].lstrip().startswith("select"):
df.show(100)
if __name__ == '__main__':
# 2) 编写SQL执行:
executeSQLFile('04_insurance_dw_prem_std.sql')
05-13
5512
08-28
274