我正在执行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
答案 0 :(得分:0)
RDD JOIN,SPARK SQL JOIN被称为转换。我在DataBricks Notebook上运行时没有问题,但我不知道“ ... //在readDF上执行了多个昂贵的转换,从而使其DAG增大了。...那里可能有一个动作。
答案 1 :(得分:0)
实际上,检查点似乎可以修复长期运行的联接。现在,它表现为一种转换,返回速度更快。因此,我得出结论,延迟与DAG谱系较大有关。
此外,后续操作现在更快。