我正在尝试在纯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中没有可用的爆炸功能,我还能实现吗?
简单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))
希望这会有所帮助!