可能这是一个简单的问题,但我用火花开始冒险。
问题:我想在spark中获得以下结构(预期结果)。现在我有以下结构。
title1,{word11,word12,word13 ...}
title2,{word12,word22,word23 ...}
数据存储在数据集[(String,Seq [String])]
中例外结果 我想得到Tuple [word,title]
word11,{title1}
word12,{title1}
我做什么
1.制作(标题,序号[word1,word2,word,3])
docs.mapPartitions { iter =>
iter.map {
case (title, contents) => {
val textToLemmas: Seq[String] = toText(....)
(title, textToLemmas)
}
}
}
感谢您的回答。
答案 0 :(得分:3)
这应该有效:
val result = dataSet.flatMap { case (title, words) => words.map((_, title)) }
答案 1 :(得分:2)
另一个解决方案是调用explode
函数,如下所示:
import org.apache.spark.sql.functions.explode
dataset.withColumn("_2", explode("_2")).as[(String, String)]
希望这能帮到你,Best Regrads。
答案 2 :(得分:2)
我很惊讶没有人提供Scala的 for-comprehension 的解决方案(得到#34; desugared"到map
和{{ 1}}与Yuval Itzchakov在编译时的回答一样)。
当您看到一系列flatMap
和map
(可能带有filter
)时,Scala的理解能力就会出现。
以下内容:
val result = dataSet.flatMap { case (title, words) => words.map((_, title)) }
等同于以下内容:
val result = for {
(title, words) <- dataSet
w <- words
} yield (w, title)
毕竟,这就是为什么我们享受Scala的灵活性,不是吗?