我有一个简单的问题。我正在使用Spark
加载一个大型的extrenal数据源Map<String, String> options = new HashMap<String, String>();
options.put("url", "jdbc:postgresql:dbserver");
options.put("dbtable", "schema.tablename");
DataFrame myDF= sqlContext.read().format("jdbc"). options(options).load();
我想知道我的外部sql数据库是否已更新,更改将反映到我的数据框中,或者我再次需要调用load函数来填充数据框。
在我需要再次调用load函数的情况下,Spark中是否有更有效的方法可以在外部源更改时更新数据帧?
答案 0 :(得分:0)
简短回答不是,但细节相对微妙。一般来说Spark不能保证数据库的一致状态。每个执行程序在单独的事务中获取其自己的部分数据,因此如果数据被主动修改,则无法保证所有执行程序都将看到数据库的相同状态。
当您考虑显式和隐式(shuffle文件)缓存以及可能的执行程序失败和缓存驱逐时,这会变得更加复杂。因此,如果您想要一致的数据库视图,那么它必须得到模型和查询的支持。通常,这意味着数据源应支持一致的时间点查询,并且您从Spark执行的每个查询都应使用特定的时间戳。
在不了解您的用例的情况下,最后一个问题很难回答,但至少有两个问题: