Postgresql 为什么连续读取的计数结果不同?

Postgresql 为什么连续读取的计数结果不同?,postgresql,apache-spark,jdbc,apache-spark-sql,Postgresql,Apache Spark,Jdbc,Apache Spark Sql,我有以下代码正在将表读取到apache spark数据帧: val df = spark.read.format("jdbc").option("url", "jdbc:postgresql:host/database").option("dbtable", "tablename").option("user", "username").option("password", "password").load() 当我第一次调用df.count()时,得到的数值比下次调用相同的count方法时的

我有以下代码正在将表读取到apache spark数据帧:

val df = spark.read.format("jdbc").option("url", "jdbc:postgresql:host/database").option("dbtable", "tablename").option("user", "username").option("password", "password").load()
当我第一次调用
df.count()
时,得到的数值比下次调用相同的
count
方法时的数值要小

为什么会这样

当我第一次读取我的表时,Spark没有在Spark集群上的数据帧中加载该表的快照吗

我的postgres表一直在被输入,我的数据框似乎反映了这种行为


在调用
read
方法之前,我应该如何将我的表中的静态快照加载到spark的数据帧中?

除非
数据集
使用可靠的存储进行缓存(标准spark
缓存只会给您微弱的保证),否则数据库可能会被多次访问,每次显示数据库的当前状态。自

继续为博士后提供食物

看到不同的计数是一种预期行为

此外,如果JDBC源代码以分布式模式使用(使用分区列或
谓词
),那么每个执行器线程将使用自己的事务。因此,
数据集的状态可能不完全一致


我应该如何设法只加载一个静态快照

不要使用JDBC。你可以举个例子

  • 将数据加载到文件系统并从那里加载
  • 使用您选择的复制解决方案创建专用于分析的复制副本,并在使用分析数据时设置和暂停复制

您是否尝试在postgresql端检查表行计数?@RamGhadiyaram是的,这与我从spark端的计数方法得到的结果完全相同。因此,我的spark数据框确实反映了我在postgre上的表中的这种动态行为。我认为……可能是spark只读取postgre sql的提交数据,这就是为什么您的df.count会不断变化的原因。@RamGhadiyaram,是的,这听起来像是引擎盖下发生的事情。我认为Skad读取了所有的内容,然后对数据文件的后续调用将考虑我在星星之火上加载的表的静态副本。但情况似乎并非如此。“我应该如何通过调用time read方法将静态快照我的表加载到spark的DataFrame?”-您不能在postgre表级别引入快照id、snapshot\u datetime,然后根据这些参数从spark sql读取它吗?