首页 > 解决方案 > spark 在加入之前检查空数据集吗?

问题描述

我有一个 Spark 作业,它内部连接一个大型 Hive 表(50 亿行,400MB x 1000 分区,压缩镶木地板)和一个小得多的表,该表可能包含少于几百行,并且在某些/大多数周可能是空的。

大表中的数据没有被连接键分区/存储,并且在任何情况下连接键都非常倾斜,因此尝试非广播连接会导致一些执行程序超出内存限制。

幸运的是,较小的表大小将始终低于广播阈值,因此通过使用broadcast(rhs)我可以避免通过倾斜键对大数据集进行洗牌。

现在,当 RHS 为空时,Spark 似乎仍在做大量工作,而结果似乎相当明显,结果将是一个空的 Dataset。

我只能假设 Spark 在(内部)加入之前不会检查空数据集,因为检查可能很昂贵,但希望得到明确的答案。

就我而言,我知道 RHS 会很小,因此调用 rhs.rdd.count 会很便宜,如果不需要,我可以跳过加入。

我不得不省略业务敏感代码,但基本算法是:

// Note small and large tables are cached for later re-use

    smallTable
      // Complex DAG
      // write to hive
      .cache

    largeTable
      // read from hive
      .cache

    largeTable.as("l")
      .join(broadcast(smallTable.as("r")), $"l.key" === $"r.key", "inner")
      .select($"l.*")
      .as[LargeTable]
      .mapPartitions(mapPartitionsFunction)

感谢您的任何见解。

特里。

标签: apache-sparkapache-spark-sql

解决方案


推荐阅读