Jdbc 如果经过一定的持续时间,Pyspark会定期从数据库中获取数据
我正试图在Pyspark中根据条件current_time-lastReadTime>refresh_interval定期从数据库中读取数据。 我提供的刷新间隔是5分钟 这是卡夫卡的结构化流媒体,我随后加入了来自postgres的数据 然而,每当我在5分钟内更改数据库中的数据时,我都会从数据库中获取新数据,即使5分钟还没有过去 下面是我正在使用的代码Jdbc 如果经过一定的持续时间,Pyspark会定期从数据库中获取数据,jdbc,pyspark,spark-structured-streaming,Jdbc,Pyspark,Spark Structured Streaming,我正试图在Pyspark中根据条件current_time-lastReadTime>refresh_interval定期从数据库中读取数据。 我提供的刷新间隔是5分钟 这是卡夫卡的结构化流媒体,我随后加入了来自postgres的数据 然而,每当我在5分钟内更改数据库中的数据时,我都会从数据库中获取新数据,即使5分钟还没有过去 下面是我正在使用的代码 def __init__(self, config,spark): self.refresh_frequency_sec = config
def __init__(self, config,spark):
self.refresh_frequency_sec = config.getint('postgres-config', 'refresh-frequency-sec')
self.spark = spark
self.lastMetaReadTime = time()
self.rules = self.fetchRules()
def fetchRules(self):
jdbcDF = self.spark.read \
.format("jdbc") \
.option("driver", "org.postgresql.Driver")\
.option("url", self.connection_url) \
.option("dbtable", self.dbtable) \
.option("user", self.user) \
.option("password", self.password) \
.load()
return jdbcDF
def getRules(self):
if time() - self.lastMetaReadTime > self.refresh_frequency_sec:
self.rules = self.fetchRules()
self.lastMetaReadTime = time()
return self.rules
我做错了什么?您是否正在缓存
jdbcDF
?如果不缓存数据帧,spark将在每次使用时重新加载它。我之前缓存jdbcDF,但即使间隔结束后,jdbcDF也没有使用最新数据进行更新。您没有共享使用规则数据帧的代码,但最可能发生的情况是,您的客户机只使用第一次加载的jdbcDF
。也就是说,只调用一次方法getRules
。您可以通过在方法中添加日志来验证这一点。您可以使用另一种方法,使用后台任务定期取消持久化并再次缓存jdbcDF