当前位置: 首页 > 知识库问答 >
问题:

加入两个大桌子与Apache Spark

龙哲
2023-03-14

我想使用Spark通过特定的互键连接两个非常大的表,我试图了解什么是实现这一点的最佳方法。

举个例子:

  • 表1包含900M行和约100列
  • 表2包含600M行和约200列。
  • 我们不能用“广播连接”,桌子大,不能广播。

我想使用两个表中都存在的相互“id”列来联接(内部联接)这两个表,此外,我知道这两个表中的id列包含相同的值,不存在一个表中存在而另一个表中不存在的id值。

我能想到的理想方法是将我的每一个表“划分”为包含相同“id”值的分区/桶,并将它们发送给同一个执行器,该执行器将在集群中以最小的数据混洗来计算连接结果。

我的问题是:

  1. 如果我为每个表使用例如. re

例如:

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,它一定是相同的吗?

如果我以同样的方式使用“bucketBy ”,我会在表的桶中得到相同的“id”值吗?

spark会将正确的分区发送给同一个执行器吗?我的意思是,包含表1的[id=1,id=2]的分区和包含表2的[id=1,id=2]的分区将被发送到同一个执行程序进行连接。

如果我错过了什么,或者你可以推荐另一种方法,在我提到的假设下加入2个大表,这将非常有帮助。

共有1个答案

彭正谊
2023-03-14

看看这个答案
TLDR:如果您想加入它们一次,并且这是重新分区的唯一目标,只需加入它们即可。

 类似资料:
  • 问题内容: 我有两个具有相同列的表,我需要将一个表的行复制到另一表的行,以创建一个包含两个表中所有值的大表。现在,我正在执行此查询以返回相同的内容: 但是,这似乎效率极低,并且在我的系统上非常慢(返回1210189条记录)。 问题答案: 可能只是这样做:

  • 问题内容: 我有一张桌子 我想得到所有薪水高于A薪水的员工。我不想使用任何嵌套或子查询。在一次采访中有人问过,提示是使用自我加入。我真的不知道如何实现相同的目标。 问题答案: 使用自我加入

  • 问题内容: 我正在尝试检索两组信息(一个查询中该图的红色和蓝色部分)。 我以为我可以使用下面所述的sql来做到这一点,但是当TableC没有记录时,它什么也不会返回。如果TableC没有记录,我仍然希望该查询向我返回BLUE区域指示的结果。 从表A中选择A. * 加入TableB B ON(A.id = B.a_id) 联接表C C ON(A.id = C.a_id) 感谢任何指针,以向我返回红色

  • 问题内容: 我正在构建类似Twitter的应用程序。有一个供稿,我只想在其中显示我关注的用户的帖子。 我尝试了所有使用join的操作,但是似乎没有任何效果。 我有3个表:,, 表格如下所示: 用户数 : 关注 :, 股份 : 我需要得到的是“所有共享,其中share.user_id = followers.follower_id”“ ANDWHERE followers.user_id = use

  • 2.Add Two Numbers [M] 题目: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbe

  • 问题内容: 我有一个带有包含文本的列的表,并且我想选择所有表,其中第二个表中某一行的文本出现在该行中。这是一个伪查询: 但是,以上查询不起作用。如何正确执行此操作? 问题答案: 您不能使用运算符连接字符串(仅用于算术运算)。使用代替。