[英]Spark SQL join really lazy?
我在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谱系。 - 使用Spark 2.3.0和Scala
RDD JOIN,SPARK SQL JOIN被称为转换。 我在DataBricks Notebook上运行时没有任何问题,但我并不知道“...... //在readDF上执行多个昂贵的转换,使其DAG增长......可能在那里有一个Action。
实际上,检查点似乎可以解决长时间运行的问题。 它现在表现为转换,返回更快。 因此,我得出结论,延迟与大型DAG谱系有关。
此外,后续操作现在更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.