在普通Scala中是否有等效的爆炸函数?

问题描述 投票:1回答:1

我正在尝试在纯scala而不是Spark中寻找爆炸功能或等效功能。使用Spark中的explode函数,我能够将具有多个元素的行展平为多行,如下所示。

scala> import org.apache.spark.sql.functions.explode
import org.apache.spark.sql.functions.explode

scala> val test = spark.read.json(spark.sparkContext.parallelize(Seq("""{"a":1,"b":[2,3]}""")))

scala> test.schema
res1: org.apache.spark.sql.types.StructType = StructType(StructField(a,LongType,true), StructField(b,ArrayType(LongType,true),true))

scala> test.show
+---+------+
|  a|     b|
+---+------+
|  1|[2, 3]|
+---+------+

scala> val flat = test.withColumn("b",explode($"b"))
flat: org.apache.spark.sql.DataFrame = [a: bigint, b: bigint]

scala> flat.show
+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  1|  3|
+---+---+

在不使用Spark的简单scala中是否存在爆炸等效函数?如果在scala中没有可用的爆炸功能,我还能实现吗?

scala
1个回答
0
投票

简单flatMap在这种情况下会为您提供帮助。我不知道确切的数据结构,您想在scala中使用它,但是让我们举一个人造的例子:

val l: List[(Int, List[Int])] = List(1 -> List(2, 3))
val result: List[(Int, Int)] = l.flatMap {
  case (a, b) => b.map(i => a -> i)
}
println(result)

将产生下一个结果:

List((1,2), (1,3))

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.