SQL外部源的Spark自动更新



我有一个简单的问题。我正在使用Spark 加载一个大型外部数据源

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中有没有更有效的方法可以在外部源发生变化时更新数据帧?

简短的回答是不会,但细节相对微妙。通常,Spark不能保证数据库的一致状态。每个执行器在单独的事务中获取自己的部分数据,所以如果数据被主动修改,就不能保证所有执行器都能看到数据库的相同状态。

当您考虑显式和隐式(shuffle文件)缓存以及可能的执行器故障和缓存驱逐时,这会变得更加复杂。因此,如果您想要数据库的一致视图,那么它必须得到模型和查询的支持。一般来说,这意味着数据源应该支持一致的时间点查询,并且您从Spark执行的每个查询都应该使用特定的时间戳。

如果不了解更多关于用例的信息,最后一个问题真的很难回答,但至少有两个问题:

  • Spark数据结构不太适合小型增量更新。调度成本相对较高,增量联合引入了不同的问题,如长谱系和复杂的分区管理
  • 没有独立于供应商的方法来监视数据库更改

相关内容

  • 没有找到相关文章

最新更新