在本篇artipostle中,我們將介紹Spark Structured Streaming中可用的不同連接以及如何使用Scala實現它們。

目的

在本文中,我們將介紹Spark Structured Streaming中可用的不同連接。在流式作業中,您可能擁有多個靜態和流式數據源。您可能必須加入它們以實現各種功能。我們將看到Spark Structured Streaming如何處理靜態和流式數據集的各種類型的連接。

Spark結構化流媒體連接

概觀

下表概述了左/右的不同類型的流以及結構化流中支持/不支持的內容。

內部聯接

從上表可以看出,無論是靜態數據集還是流式數據集,都支持內連接。流和靜態數據集的內部連接不必是有狀態的,因爲流中的記錄集將與靜態記錄集匹配。具有靜態和流連接的內部聯接不是有狀態的,而當您內部連接兩個流數據集時,可選地,您可以爲其添加水印並添加時間約束。我們將在後面的部分討論兩個流數據集的內部連接。

完全外部加入

僅在連接兩個靜態數據集時才支持完全外部聯接。從下表可以看出,如果涉及流式數據集,則不支持完全外部連接。在任何流數據集中不支持完全外連接的原因之一是由於左和右都不必等待彼此的匹配數據到達。在流式傳輸中,由於遲到的數據,給定的記錄可能與同一窗口中的相應記錄不匹配,並且當您使用完全外部連接時,這可能導致非常不一致的輸出。

靜態數據和靜態連接

在流式作業中使用靜態數據集時,數據僅在作業開始時加載一次。當您連接兩個靜態數據集時,支持所有類型的連接。我們不會在本文中詳細介紹兩種類型的靜態連接數據集。

流數據和靜態lian'jie

在上述配置中使用流式數據集和靜態數據集時,僅支持內部聯接和左外部聯接。不支持右外連接和完全外連接。

在我看來,不需要右外連接,因爲只有靜態數據將作爲微批量的輸出返回,這可能沒什麼用處。出於同樣的原因,我認爲也不支持完整的外連接。左外連接本身足以在沒有匹配的靜態記錄時返回流記錄。

流媒體和靜態數據集上的內部連接和左外部連接不必是有狀態的,因爲給定窗口中的流式記錄集可以與靜態記錄集匹配。

靜態數據和流連接

當我們左邊有一個靜態數據集而右邊有一個流數據集時,只支持內連接和右外連接。不支持左外連接和完全外連接。

在我看來,不需要左外連接,因爲只有靜態數據將作爲微批量的輸出返回,這可能沒有任何用處。出於同樣的原因,我認爲也不支持完整的外連接。單獨的右外連接足以在沒有匹配的靜態記錄時返回流記錄。

靜態和流式數據集上的內部連接和右外部連接不必是有狀態的,因爲給定窗口中的流式記錄集將與靜態記錄集匹配。

摘要

對於兩個靜態流,支持所有類型的連接。當連接靜態和流時,支持內部連接和流數據集的側面,即如果流式數據集在左側,則支持左外部連接,否則,支持右外部連接。當連接兩個流時,有條件地支持內部,左外部和右外部連接。建議對所有連接應用雙面水印和時間約束。

相關文章