插入前火花混洗数据

时间:2021-07-13 07:17:32

标签: scala apache-spark hadoop

CalcDf().show 导致 show 本身的 13 个阶段(0-12)+1(13)。 enter image description here

当我尝试将结果写入表格时,我假设应该只有 13 个阶段(0-12),而是我看到了额外的阶段(13)。它来自哪里,它有什么作用?我没有执行任何需要洗牌的重新分区或其他操作。据我了解,spark 应该只将 1100 个文件写入表中,但这不是正在发生的事情。

CalcDf()
.write
.mode(SaveMode.Overwrite)
.insertInto("tn")

enter image description here CalcDf() 逻辑

val dim = spark.sparkContext.broadcast(
spark.table("dim")
.as[Dim]
.map(r => r.id-> r.col)
.collect().toMap
)

spark.table("table")
.as[CustomCC]
.groupByKey(_.id)
.flatMapGroups{case(k, iterator) => CustomCC.mapRows(iterator, dim)}
.withColumn("time_key", lit("2021-07-01"))

1 个答案:

答案 0 :(得分:1)

前一阶段 #12 已经完成了随机写入,因此任何后续阶段都必须通过随机读取(您在 #13 中注意到)从中读取数据。

为什么有一个额外的阶段?

因为第 12 阶段有随机写入而不是输出

为了理解第 12 阶段,请提供有关如何构建 CalDf 的信息。

编辑

groupByKey 将进行随机写入,以便在单个执行程序 JVM 上获得相同的 id。

stage 13 正在读取这个打乱的数据并在之后计算 map 操作。

任务数量的差异可归因于操作。
在 show() 中,它没有读取整个混洗数据。可能是因为它显示 20 行(默认) 而在 insertInto(...) 中,它对整个数据进行操作,因此读取所有数据。

stage #13 不仅仅是因为它在写文件,它实际上是在做计算。

相关问题