为什么连续读取会产生不同的计数结果?

时间:2017-05-01 14:46:20

标签: postgresql apache-spark jdbc apache-spark-sql

我有以下代码正在读取表格到apache spark DataFrame:

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 Cluster上的DataFrame中加载了我的表的快照?

我在 postgres上的表格一直在被喂食,似乎我的数据框架反映了这种行为。

在调用read方法时,我应该如何设置只将静态快照加载到我的表中以激发数据框架?

1 个答案:

答案 0 :(得分:1)

除非Dataset cached使用可靠的存储(标准Spark cache只会给您提供弱保证),否则可以多次访问数据库,每次都显示数据库的当前状态。由于

  postgres上的表继续被喂食

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

此外,如果JDBC源在分布式模式下使用(使用分区列或predicates),则每个执行程序线程将使用自己的事务。因此,Dataset的状态可能不完全一致。

  

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

不要使用JDBC。例如,你可以

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