使用 Scala 和 Spark 创建 RDD 并输出到文本文件

Creating RDDs and outputting to text files with Scala and Spark

我很抱歉这可能是一个简单的问题,但我正在努力掌握使用 scala/spark 解析 rdd。我有一个从 CSV 创建的 RDD,用

读入
    val partitions: RDD[(String, String, String, String, String)] = withoutHeader.mapPartitions(lines => {
            val parser = new CSVParser(',')
            lines.map(line => {
                    val columns = parser.parseLine(line)
                    (columns(0), columns(1), columns(2), columns(3), columns(4))
            })
    })

当我使用

将其输出到文件时
partitions.saveAsTextFile(file)

我得到的输出每行都有括号。我不想要这些括号。我一般都在努力了解这里发生的事情。我的背景是低级语言,我正在努力通过抽象来了解它实际在做什么。我了解映射,但它是逃避我的输出。有人可以向我解释 (columns(0), columns(1), columns(2), columns(3), columns(4)) 行中发生的事情,或者向我指出一个简单解释正在发生的事情的指南吗?

我的最终目标是能够在 spark 中操作 hdsf 上的文件,将它们放入适合的格式 mllib.I我对 spark 或 scala 指南不感兴趣,因为它们看起来像是已经生成带有注释不佳的 javadoc,并没有真正解释任何东西。

提前致谢。

院长

我会将您的元组转换为您想要的字符串格式。例如,创建 |-delimited 输出:

partitions.map{ tup => s"${tup._1}|${tup._2}|${tup._3}|${tup._4}|${tup._5}" }

或使用模式匹配(这会产生更多的运行时开销):

partitions.map{ case (a,b,c,d,e) => s"$a|$b|$c|$d|$e" }

我正在使用 Scala 的字符串插值功能(注意 s"..." 格式)。

旁注,您可以通过仅映射整个 RDD 而不是单个分区来简化您的示例:

val parser = new CSVParser(',')
val partitions: RDD[(String, String, String, String, String)] = 
  withoutHeader.map { line => 
    val columns = parser.parseLine(line)
    (columns(0), columns(1), columns(2), columns(3), columns(4))
  }