我正在尝试通过每日ETL Spark作业将S3上的Spark数据库与较旧的Oracle数据库同步。我试图理解Spark连接到像Oracle这样的RDS来获取数据时所做的事情。
它是否仅获取Spark向DB请求时的数据(即,如果它在2/2 17:00:00从Oracle DB获取数据,它将仅获取数据到达该时间点)?基本上是说从数据提取中无法获得2/2 17:00:01的任何新数据或更新?
答案 0 :(得分:1)
嗯,这取决于。通常,您必须假设此行为是非确定性的,除非您的应用程序和数据库设计明确确保。
默认情况下,Spark会在每次对相应的Spark数据集执行操作时获取数据。这意味着每次执行都可能会看到数据库的不同状态。
此行为可能受多种因素的影响:
在前两种情况下,Spark可以重用已经获取的数据,而无需返回原始数据源。第三个更有趣。默认情况下,Spark使用单个事务获取数据,但有一些方法可以根据列范围或谓词启用并行读取。如果使用其中一个,Spark将使用多个事务获取数据,并且每个事务都可以观察数据库的不同状态。
如果需要一致的时间点语义,您基本上有两个选择:
虽然第一种方法功能更强大,但如果您使用现有的架构,则实施起来要困难得多。