apache-spark - 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)
感谢您的任何见解。
特里。
解决方案
推荐阅读
- neo4j - 查找通过 2 个关系连接到至少 2 个相同节点但中间节点不同的节点
- php - 使用 Regex 对文件列表进行排序
- laravel - 为什么它在服务器中冲洗时显示“无法访问此站点”?
- gcc - gcc 是否支持多线程
- spring - 创建 Spring Boot bean 时出错 - “空白的最终字段 em 可能尚未初始化”
- ruby-on-rails - 通过 systemd 运行 Sidekiq 时,日志在哪里?
- reactjs - 处理带有类型的表单
- c++ - 使用 c++ 将 x86 操作码转换为助记符或汇编语言
- google-sheets - 如果单元格包含某个短语,则 IF 返回某个值,但中间没有空格/N/A
- racket - 如何在 Racket 中获取命令行密码输入