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

Spark SQL Join:它的实际工作原理

亢保赫
2023-03-14

我未能弄清楚Spark SQL join操作实际上是如何工作的。我读过相当多的解释,但它没有给一些问题带来光明。

例如,您有两个以Spark(parquet或任何其他格式)保存的数据库表。您必须根据一些列加入它们:

SELECT t1.column_name_1 
FROM parquet.`data/table1.parquet` as t1 
LEFT JOIN parquet.`data/table2.parquet` as t2 
ON t2.column_name_2 = t1.column_name_1 
WHERE t2.column_name_2 is NULL 
LIMIT 1

我将以sparksession.sql(joinQuery)的形式启动该查询

    null
table1 JOIN table2 = table1_subset1 JOIN table2 + table1_subset2 JOIN table2 
table1 JOIN table2 = table1_subset1 JOIN table2_subset1 + table1_subset2 JOIN table2_subset1 +
                     table1_subset1 JOIN table2_subset2 + table1_subset2 JOIN table2_subset2  

现在我必须连接大约50对巨大的表,它们中的每一个都应该被分成多个块(子集),比如说5个块。因此,我将获得块之间的50 joins50*5*5=1250筛选和联接操作,而不是50 joins,其中每个块比原始表(RDD)小5倍。

如果我认为性能会大大降低,我说得对吗?或者Spark足够聪明,可以执行相同数量的洗牌?


共有1个答案

段干博明
2023-03-14

1)您可以通过显式设置spark.shuffle.manager(默认为sort)在shuffle sort join或shuffle hash join之间进行选择。这里有更多的信息。当两个表中都有很多键时,hash更有效。

2)为了解决这个问题,您需要在到达此点之前对数据进行筛选。实际上,添加一个步骤会更快,即创建一个表示您关心的数据子集的DataFrame。如果您无法将DataFrame放入内存,默认情况下Spark也会溢出到磁盘。对于占用所有内存的大型DataFrame,您可以使用saveAsTable()。

 类似资料:
  • 我写了下面的函数(当我读里奇关于C的书时),从命令行获取一行。它做了它应该做的事情,我理解它是如何工作的,但我想深入一点。 我的问题是关于循环的,假设我们有一个空白命令行,它正在等待用户输入内容,因为第一个getchar()在循环中被调用,假设用户输入了以下内容: 我猜接下来会发生什么,是getchar()在arr[]中存储“h”,而用户实际上没有按回车键。 因此如果用户继续键入: 'h''e''

  • 我使用的是systemd服务,它在进程“启动”时调用进程(例如,systemctl start test.service)。根据设计,进程永远处于循环中,我们可以使用“ps”命令看到进程的存在。我们还看到,对于systemctl stop命令,进程正在被终止(如预期的那样)。然而,我们的要求是,在进程被杀死之前,我们希望在进程内执行一些安全的关闭操作。但我不知道如何从过程中检测到系统停止操作。 执

  • 问题内容: 每当您尝试调用对象时,都会调用Python的magic方法。因此等于。 函数是Python中的一类对象,这意味着它们只是可调用的对象(使用)。但是,它本身是一个函数,因此它也具有,又具有自己的功能,又具有自己的功能。 因此,因此等于并再次等于等,依此类推。 这个无限循环如何结束?实际如何执行代码? 问题答案: 在幕后,Python中的所有调用都使用相同的机制,并且几乎所有调用都在CPy

  • 新手,谁有实际工作经验的,说说Docker在实际工作中的具体使用场景吧,谢谢!

  • 问题内容: 编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化? 问题答案: 不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。 为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看

  • 问题内容: 我有一个Applet,它使用URLConnection通过HTTP连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然看不到任何缓存行为。我图像的HTTP标头具有合理的缓存设置。如果您查看错误4528599,则有一个相当神秘的陈述: Java插件的当前版本(1.3.1)仅检查浏览器缓存中名称以.jar或.class结尾的文件。我被告知,对于Java Plug-