首页 > 解决方案 > 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

当我保存最终数据帧时,即评估所有上述数据帧。我的方法好吗?还是我需要缓存/持久化中间数据帧?

标签: apache-sparkapache-spark-sql

解决方案


这是一个非常笼统的问题,很难给出明确的答案。

根据表的大小,您可能希望对任何相对较小的表进行广播提示。您可以通过

table_i.join(broadcast(table_j), ....)

此行为取决于中的值: 现在广播提示将仅在 Spark 能够评估表的值时才会被兑现,因此您可能需要cache(). 另一种选择是通过 Spark 检查点,它可以帮助截断本地优化计划(这也允许您从检查点位置恢复作业,它类似于写入 HDFS,但有一些开销)。

如果广播几百个 Mb 表,您可能需要增加 kryo 缓冲区:

    --conf spark.kryoserializer.buffer.max=1g

它还取决于您将使用哪种连接类型。您可能希望尽早进行过滤和聚合,因为它会减少连接面。

为了适当地优化这一点,还有许多其他的考虑因素需要考虑。如果任何连接中连接键的幂律分布,您将需要进行盐渍化并分解较小的表。


推荐阅读