Есть ли эквивалентная функция разнесения в простой Scala? - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь найти функцию разнесения или ее эквивалент в простом scala, а не в Spark. Используя функцию разнесения в Spark, я смог сгладить строку с несколькими элементами в несколько строк, как показано ниже.

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|
+---+---+

Существует ли эквивалентная функция разнесения в простом scala без использования Spark? Можно ли как-нибудь реализовать это, если в scala нет функции разнесения?

1 Ответ

6 голосов
/ 24 февраля 2020

Простой 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))

ОБНОВЛЕНИЕ

Как предложено в разделе комментариев @jwvh, тот же результат может быть достигнут с использованием конструкции for-comprehension и скрытием явных вызовов flatMap & map:

val result2: List[(Int, Int)] = for((a, bList) <- l; b <- bList) yield a -> b

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...