簡體   English   中英

用 Apache Spark 連接兩個大表

[英]Join two big tables with Apache Spark

我想使用 Spark 通過特定的互鍵加入 2 個非常大的表,我試圖了解這樣做的最佳方法是什么。

比方說,例如:

  • 表 1 包含 900M 行和 ~100 列
  • 表 2 包含 6 億行和約 200 列。
  • 我們不能使用“廣播連接”,表很大,不能廣播。

我想使用兩個表中都存在的相互“id”列來加入(內連接)表,此外,我知道 id 列在兩個表中包含相同的值,不存在 id 值在一個中,但在另一個中不存在。

我能想到的理想方法是將我的每個表“划分”為包含相同“id”值的分區/存儲桶,並將它們發送到同一個執行程序,該執行程序將在集群中以最少的數據混洗計算連接結果.

我的問題是:

  1. 如果我為每個表使用 example.repartition(5, 'id') - 5 個分區中的每一個都將包含相同的 'id' 值? (只要我們在它們中都有相同的 'id' 值)

例如:

df1
+---+---+------+
|age| id|  name|
+---+---+------+
|  5|  1| David|
| 50|  2|  Lily|
| 10|  3|   Dan|
| 15|  4|Nicole|
| 16|  5|  Dana|
| 19|  6|   Ron|
| 20|  7| Alice|
| 22|  8|  Nora|
| 45|  9|  Sara|
| 70| 10| Aaron|
+---+---+------+


df2
+---+-----+
| id|price|
+---+-----+
|  1| 30.8|
|  1| 40.3|
|  2|100.0|
|  2| 30.1|
|  3| 99.0|
|  3|102.0|
|  4| 81.2|
|  4| 91.2|
|  5| 73.4|
|  6| 22.2|
|  7|374.4|
|  8|669.7|
|  9|  4.8|
| 10|35.38|
+---+-----+

df1.repartition(5,'id')
df2.repartition(5,'id')

如果 df1 分區是:[id=1,id=2],[id=3,id=4],[id=5,id=6],[id=7,id=8],[id=9, id=10]

df2 一定是一樣的嗎?

  1. 如果我以相同的方式使用“bucketBy”,我會在表的存儲桶中獲得相同的“id”值嗎?

  2. spark 會將正確的分區發送到同一個執行程序嗎? 我的意思是,包含表 1 的 [id=1,id=2] 的分區和包含表 2 的 [id=1,id=2] 的分區將被發送到同一個執行器進行連接。

如果我錯過了什么,或者您可以根據我提到的假設推薦另一種方法來加入 2 個大表,這將非常有幫助。

看看這個答案
TLDR:如果你想加入他們一次並且它的唯一目的是重新分區,只需簡單地加入他們。

是的,它必須是這樣的,否則整個 JOINing 范式將不可靠。

你的意思實際上是 Worker - 帶有 Executor(s) 的機器。

不建議單獨進行重新分區作為循環。

范圍分區也有效。 檢查以確保,但假設分區值的分布與附帶條件相同。

這一切都在惰性評估的前提下工作。

可以使用 bucketBy - 但更多的是用於持久化到磁盤並在下一個應用程序中使用。

同樣,您不必擔心協助,因為惰性評估意味着優化器有機會將其全部解決 - 分配給哪個 Worker。 但那是在較低的細節層次上,抽象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM