使用spark中的scala转换数据

时间:2016-09-18 09:31:26

标签: scala intellij-idea apache-spark sdk java-7

我正在尝试将输入文本文件转换为键/值RDD,但下面的代码不起作用。(文本文件是一个制表符分隔文件。)我是Scala和Spark的新手,所以我会真的很感谢你的帮助。

import org.apache.spark.{SparkConf, SparkContext}
import scala.io.Source

object shortTwitter {

  def main(args: Array[String]): Unit = {
    for (line <- Source.fromFile(args(1).txt).getLines()) {
      val newLine = line.map(line =>
      val p = line.split("\t")
      (p(0).toString, p(1).toInt)
      )
}

    val sparkConf = new SparkConf().setAppName("ShortTwitterAnalysis").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val text = sc.textFile(args(0))
    val counts = text.flatMap(line => line.split("\t"))
  }
}

1 个答案:

答案 0 :(得分:1)

我假设您希望生成的RDD具有RDD[(String, Int)]类型,所以 -

  • 您应该使用map(将每条记录转换为单个新记录)而不是flatMap(将每条记录转换为多个记录)
  • 您应该将split的结果映射到元组

总而言之:

val counts = text
  .map(line => line.split("\t"))
  .map(arr => (arr(0), arr(1).toInt))

编辑在评论中澄清:如果您还对修复非Spark部分(按顺序读取文件)感兴趣,那么for-comprehension语法中会出现一些错误,这就是整个事情:

def main(args: Array[String]): Unit = {
  // read the file without Spark (not necessary when using Spark):
  val countsWithoutSpark: Iterator[(String, Int)] = for {
    line <- Source.fromFile(args(1)).getLines()
  } yield {
    val p = line.split("\t")
    (p(0), p(1).toInt)
  }

  // equivalent code using Spark:
  val sparkConf = new SparkConf().setAppName("ShortTwitterAnalysis").setMaster("local[2]")
  val sc = new SparkContext(sparkConf)
  val counts: RDD[(String, Int)] = sc.textFile(args(0))
    .map(line => line.split("\t"))
    .map(arr => (arr(0), arr(1).toInt))
}