我有以下代码正在读取表格到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
方法时,我应该如何设置只将静态快照加载到我的表中以激发数据框架?
答案 0 :(得分:1)
除非Dataset
cached
使用可靠的存储(标准Spark cache
只会给您提供弱保证),否则可以多次访问数据库,每次都显示数据库的当前状态。由于
postgres上的表继续被喂食
看到不同的计数是预期的行为。
此外,如果JDBC源在分布式模式下使用(使用分区列或predicates
),则每个执行程序线程将使用自己的事务。因此,Dataset
的状态可能不完全一致。
我应该如何设法只加载静态快照
不要使用JDBC。例如,你可以
COPY
数据到文件系统并从那里加载。