gpt4 book ai didi

java - Spark SQL连接: how it actually works

转载 作者:行者123 更新时间:2023-12-02 02:57:30 27 4
gpt4 key购买 nike

我没能弄清楚 Spark SQL 连接操作实际上是如何工作的。我已阅读pretty massive explanation ,但它并没有阐明一些问题。

示例

例如,您有两个数据库表保存在 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)

问题

  1. Spark 如何洗牌 table1.parquet RDD 和 table2.parquet RDD? 据我了解,Spark 需要一些 key ,通过它进行洗牌。如果 column_name_1column_name_2 各有 1.000.000 个唯一行,那么键是什么?我将获得多少个唯一的 key (分区)?我会得到多少次洗牌?
  2. 是否可以让 Spark 不将整个 table1.parquettable2.parquet RDD 提取到内存中?

为什么我对过滤持怀疑态度

有一个非常简单的解决方案 - 只需在过滤之前调整 DataFrames,您就可以将所有内容保留在 RAM 中。但是,我不确定这在我的情况下会表现良好。

假设过滤允许您从 table1 检索 table1_subset1table1_subset2。现在要获得相同的联接结果,您需要进行更多联接。我的意思是:

table1 JOIN table2 = table1_subset1 JOIN table2 + table1_subset2 JOIN table2 

如果我过滤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 对巨大的表,每个表都应该分成多个 block (子集),比如说 5 个 block 。因此,我将得到 block 之间的 50 * 5 * 5 = 1250 过滤和连接操作,而不是 50 个连接,其中每个 block 比原始表 (RDD) 小 5 倍。

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

最佳答案

1) 您可以通过显式设置spark.shuffle.manager(默认为排序)来选择随机排序连接或随机哈希连接。更多信息是 here 。当两个表中都有很多键时,哈希会更有效。

2) 为了解决此问题,您需要在执行此操作之前过滤数据。实际上,添加先前的步骤(创建代表您关心的数据子集的 DataFrame)会更快。默认情况下,Spark 也会溢出到磁盘,以防您无法将数据帧装入内存。如果数据帧很大,会占用您的所有内存,您可以使用 saveAsTable()。

关于java - Spark SQL连接: how it actually works,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com