使用 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))
}
我很抱歉这可能是一个简单的问题,但我正在努力掌握使用 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))
}