【发布时间】:2016-10-14 10:37:34
【问题描述】:
我正在使用 Spark 和 Scala。我有一个 Array[String] 的 RDD,我将对其进行迭代。 RDD 包含(name, age, work, ...) 等属性的值。我正在使用可变字符串集序列(称为attributes)来收集每个属性的所有唯一值。
把RDD想象成这样:
("name1","21","JobA")
("name2","21","JobB")
("name3","22","JobA")
最后我想要这样的东西:
attributes = (("name1","name2","name3"),("21","22"),("JobA","JobB"))
我有以下代码:
val someLength = 10
val attributes = Seq.fill[mutable.Set[String]](someLength)(mutable.Set())
val splitLines = rdd.map(line => line.split("\t"))
lines.foreach(line => {
for {(value, index) <- line.zipWithIndex} {
attributes(index).add(value)
// #1
}
})
// #2
当我调试并停在标有 #1 的行时,一切都很好,attributes 正确填充了唯一值。
但是在循环之后,在第 #2 行,attributes 再次为空。调查显示,该属性是一系列集合,大小均为 0。
Seq()
Seq()
...
我做错了什么?是否有某种我不知道的范围界定?
【问题讨论】:
-
出于专业好奇心提出的一个问题:如果您现在正在学习 Spark,为什么要使用 RDD API?为什么不是数据集/数据框?
-
@maasg 我不是 OP,但如果我刚开始使用 Spark,我可能会从较低的抽象级别开始,然后逐步升级到 DataSets/Frames。尽管从技术上讲,这可能不会“提高”抽象级别,但仍有一些事情是您无法做到的,除非您采用原始 RDD。
-
@maasg 我同意 Yuval。我觉得与 DataSets/DataFrames 相比,使用 RDD 学习 Spark 更容易且信息量更大。
标签: scala apache-spark set seq