【发布时间】:2019-04-12 16:50:25
【问题描述】:
我正在尝试处理 Spark 数据帧中的每一行,并将其转换为另一个数据帧。本质上,我有一个框架 A,其中包含一列(“id”)和另一列是句子数组。我想将其转换为另一个数据帧,每个句子都用“docID:count”标识符字符串唯一标识。我的代码是:
var sentencesCollection:Seq[SentenceIdentifier] = Seq()
tokenized.foreach(row => {
val docID = row.getAs[String]("id")
val sentences = row.getAs[Seq[String]]("sentences")
var count:Integer = 0
for (elem <- sentences) {
val sentenceID:String = docID + ":" + count
count = count + 1
val si = SentenceIdentifier(sentenceID, elem)
sentencesCollection = sentencesCollection :+ si
}
})
println(sentencesCollection.length)
但是,println 语句打印“0”。
知道我怎样才能让 sentenceCollection 成为我可以在下游进一步处理的序列吗? (可能认为是 .toDF() 调用)。
【问题讨论】:
-
那行不通,因为
foreach是由 Executors (可能在另一个 jvm 的另一台机器上) 执行的,而你的Seq只存在于 Driver 中。这已经被问过无数次了。如果您想拥有数据的本地副本,请使用collect。 - 但是,由于您要做的是创建一个新的DataFrame,因此创建本地集合会浪费内存和性能瓶颈。有很多方法可以从另一个DataFrame创建一个新的DataFrame,例如选择、过滤或映射(在Dataset)。我认为您应该阅读更多关于 Spark 的工作原理
标签: scala apache-spark dataframe