Spark SQL联接真的很懒吗?

时间:2019-06-15 16:01:51

标签: scala apache-spark dataframe

我正在执行8个数据帧之间的内部联接,所有这些数据帧均来自同一父级。示例代码:

// read parquet 
val readDF = session.read.parquet(...)
// multiple expensive transformations are performed over readDF, making its DAG grow

// repartition + cache
val df = readDF.repartition($"type").cache

val df1 = df.filter($"type" === 1)
val df2 = df.filter($"type" === 2)
val df3 = df.filter($"type" === 3)
val df4 = df.filter($"type" === 4)
val df5 = df.filter($"type" === 5)
val df6 = df.filter($"type" === 6)
val df7 = df.filter($"type" === 7)
val df8 = df.filter($"type" === 8)

val joinColumns = Seq("col1", "col2", "col3", "col4")
val joinDF = df1
  .join(df2, joinColumns)
  .join(df3, joinColumns)
  .join(df4, joinColumns)
  .join(df5, joinColumns)
  .join(df6, joinColumns)
  .join(df7, joinColumns)
  .join(df8, joinColumns)

出乎意料的是,joinDF句子花费的时间很长。加入应该是一种转变,而不是一种行动。

您知道发生了什么吗?这是检查点的用例吗?

注意:  -joinDF.explain显示了很长的DAG血统。  -在Scala中使用Spark 2.3.0

2 个答案:

答案 0 :(得分:0)

RDD JOIN,SPARK SQL JOIN被称为转换。我在DataBricks Notebook上运行时没有问题,但我不知道“ ... //在readDF上执行了多个昂贵的转换,从而使其DAG增大了。...那里可能有一个动作。

答案 1 :(得分:0)

实际上,检查点似乎可以修复长期运行的联接。现在,它表现为一种转换,返回速度更快。因此,我得出结论,延迟与DAG谱系较大有关。

此外,后续操作现在更快。