为什么Spark爆炸功能比平面地图功能拆分数组慢得多?

Lar*_* Lu 6 apache-spark apache-spark-sql apache-spark-dataset

我是Spark和Spark SQL的新手.我有一个2列的数据集,"col1"和"col2",而"col2"最初是一个长的Seq.我想将"col2"分成多行,这样每行只有一行.

我尝试使用爆炸功能与使用flatMap和我自己的映射器功能.他们似乎有显着的性能差异.其他一切都保持不变,"爆炸"功能似乎要慢得多flatMap(数量级取决于数据大小).为什么?

选项1:使用"爆炸"

val exploded = data.withColumn("col2", explode(col("col2")))
Run Code Online (Sandbox Code Playgroud)

选项2:使用手动flatMap

case class MyPair(col1: Long, col2: Long)

def longAndLongArrayMapper(colToKeep: Long, colToExplode: Seq[Long]) = {
    (for (val <- colToExplode) yield MyPair(val, colToKeep))
 }

val exploded = data.flatMap{ (x: Row) =>
      longAndLongArrayMapper(x.getAs[Long]("col1"), (x.getAs[Seq[Long]]("col2"))) }
Run Code Online (Sandbox Code Playgroud)