原因:Azure databricks spark overwrite 全量ADS层表更新的时候容易碰到的问题正在写入结果有服务请求这个表的数据那如何避免呢?
1、 databricks spark overwrite 到的的时候会先TRUNCATE TABLE 然后再写入,就会碰到查询是空的情况,解决办法是用存储过程解决先写入_bak表,再通过存储过程改表名的方式完成替换。以下是核心代码
注意是用 pymysql 执行
CALL DDL的在mysql的存储需要自己写哈
from pymysql import *
# 删除的操作
def ddl_mysql(ddlsql,database):
if ddlsql is None or len(ddlsql)==0:
return '参数deleteQuery异常!'
jdbcUsername = ****
jdbcPassword = ****
#创建数据库的连接
conn=connect(host='123456—_mysql.cn',user=jdbcUsername,password=jdbcPassword,database=database,charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:
cur=conn.cursor()
cur.execute(ddlsql)
# 提交事物
conn.commit()
#res=cur.fetchall()
print(ddlsql + ' is success!')
#print('sucess')
except Exception as ex:
print(ex)
finally:
cur.close()
conn.close()
下面是调用
# 开始执行用到的
Mydf = df
Mytable = "tab_produce" # 生产的表名
Myschema = "produce_db"
Mytablebak = Mytable + '_bak' # 先写入
print(' --执行存入mysql时间:' + str(datetime.datetime.now()) + ' 表为:' + Myschema + '.' + Mytablebak)
save_to_mysql_overwrite(Mydf,Myschema,Mytablebak)
print(' --在mysql上存储完成时间:' + str(datetime.datetime.now()) + ' 表为:' + Myschema + '.' + Mytablebak)
# 去call你mysql的存储过程
ddl_sql = "call xxxxx('{0}','{1}','{2}')".format(Myschema,Mytable,Mytablebak)
print(' --在mysql上执行过程开始时间:' + str(datetime.datetime.now()))
ddl_mysql(ddl_sql,Myschema)
print(' --在mysql上执行过程完成时间:' + str(datetime.datetime.now()) + ' 存入表为:' + Myschema + '.' + Mytable)
print(str(datetime.datetime.now()) + "数据写入xx表:" + Myschema + "." + Mytable +" 完成! ")