apache-spark - Spark SQL 连接多表设计
问题描述
我正在使用一组表开发 Spark SQL 分析解决方案。假设我需要 5 个表来构建我的解决方案,最后我正在创建一个输出表。这是我的流程
dataframe1 = table1 join table2
dataframe2 = dataframe1 join table3
dataframe3 = datamframe2 + filter + agg
dataframe4 = dataframe3 join table4 join table 5
// finally
dataframe4.saveAsTable
当我保存最终数据帧时,即评估所有上述数据帧。我的方法好吗?还是我需要缓存/持久化中间数据帧?
解决方案
这是一个非常笼统的问题,很难给出明确的答案。
根据表的大小,您可能希望对任何相对较小的表进行广播提示。您可以通过
table_i.join(broadcast(table_j), ....)
此行为取决于中的值: 现在广播提示将仅在 Spark 能够评估表的值时才会被兑现,因此您可能需要cache()
. 另一种选择是通过 Spark 检查点,它可以帮助截断本地优化计划(这也允许您从检查点位置恢复作业,它类似于写入 HDFS,但有一些开销)。
如果广播几百个 Mb 表,您可能需要增加 kryo 缓冲区:
--conf spark.kryoserializer.buffer.max=1g
它还取决于您将使用哪种连接类型。您可能希望尽早进行过滤和聚合,因为它会减少连接面。
为了适当地优化这一点,还有许多其他的考虑因素需要考虑。如果任何连接中连接键的幂律分布,您将需要进行盐渍化并分解较小的表。
推荐阅读
- c++ - 移动语义和运算符 + 重载
- javascript - 使用 textarea 编辑器编辑后如何重置制表符行高?
- python - 长数转换格式
- excel - 更改最大值范围内 Excel 单元格的背景色
- javascript - 设置画布图像 CSS 图像渲染属性
- javascript - 检查元素是否具有焦点 - Vue.js 指令
- c# - C# complex class constructors
- intellij-idea - Intellij - 更改活动选项卡/编辑器的颜色
- typescript - 堆栈导航器上的反应导航打字稿错误
- julia - 在 Julia 中有效地将 Dict 转换为 NamedTuple