我是Spark和Spark SQL的新手。我有一个2列的数据集,“col1”和“col2”,而“col2”最初是一个长的Seq。我想将“col2”分成多行,这样每行只有一行。
我尝试使用爆炸功能而不是使用flatMap
和我自己的映射器功能。他们似乎有显着的性能差异。其他一切都保持不变,“爆炸”功能似乎比flatMap
慢得多(数量级取决于数据大小)。为什么呢?
选项1:使用“爆炸”
val exploded = data.withColumn("col2", explode(col("col2")))
选项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"))) }