我想通過每日ETL Spark作業將S3上的Spark數據庫與舊的Oracle數據庫同步。我試圖理解Spark在連接到像Oracle這樣的RDS時如何獲取數據。Spark如何處理與時間相關的JDBC數據?
它是否只抓取Spark向DB請求的數據(即如果它在2/2 17:00:00從Oracle DB獲取數據,它將只抓取數據到該點的數據時間)?基本上說,2/2 17:00:01的任何新數據或更新都不會從數據獲取中獲得?
我想通過每日ETL Spark作業將S3上的Spark數據庫與舊的Oracle數據庫同步。我試圖理解Spark在連接到像Oracle這樣的RDS時如何獲取數據。Spark如何處理與時間相關的JDBC數據?
它是否只抓取Spark向DB請求的數據(即如果它在2/2 17:00:00從Oracle DB獲取數據,它將只抓取數據到該點的數據時間)?基本上說,2/2 17:00:01的任何新數據或更新都不會從數據獲取中獲得?
嗯,這取決於。一般來說,你必須假設這種行爲是非確定性的,除非你的應用程序和數據庫設計明確確認。
默認情況下,Spark會在您每次對相應的Spark數據集執行操作時獲取數據。這意味着每次執行都可能會看到數據庫的不同狀態。
這種行爲可以受到多種因素:
在前兩種情況下,Spark可以重新使用已獲取的數據,而無需返回原始數據源。第三個更有趣。默認情況下,Spark使用單個事務獲取數據,但有一些方法可以基於列範圍或謂詞啓用並行讀取。如果使用其中的一個,Spark將使用多個事務來獲取數據,並且每個人都可以觀察數據庫的不同狀態。
如果需要一致的點即時語義你有兩種基本選擇:
雖然第一種方法功能強大得多,但如果您使用的是現有體系結構,則實施起來要困難得多。
你能用代碼解釋這個問題嗎? – mrsrinivas