Jdbc 如果经过一定的持续时间,Pyspark会定期从数据库中获取数据

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

我正试图在Pyspark中根据条件current_time-lastReadTime>refresh_interval定期从数据库中读取数据。 我提供的刷新间隔是5分钟

这是卡夫卡的结构化流媒体,我随后加入了来自postgres的数据

然而,每当我在5分钟内更改数据库中的数据时,我都会从数据库中获取新数据,即使5分钟还没有过去

下面是我正在使用的代码

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