Scala - 从Pair RDD中删除标头

时间:2017-05-31 10:03:47

标签: scala apache-spark

我是Scala的新手,想要从数据中删除标头。我有以下数据

recordid,income
1,50000000
2,50070000
3,50450000
5,50920000

我正在使用下面的代码来阅读

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object PAN {

  def main(args: Array[String]) {
    case class income(recordid : Int, income : Int)

    val sc = new SparkContext(new SparkConf().setAppName("income").setMaster("local[2]"))
    val income_data = sc.textFile("file:///home/user/Documents/income_info.txt").map(_.split(","))

    val income_recs = income_data.map(r => (r(0).toInt, income(r(0).toInt, r(1).toInt)))
  }
}

我想从对RDD中删除标题,但不知道如何。

感谢。

===============================编辑=============== ==========================

我正在玩下面的代码

val header = income_data.first()
val a = income_data.filter(row => row != header)
a.foreach { println }

但它返回输出

[Ljava.lang.String;@1657737
[Ljava.lang.String;@75c5d3
[Ljava.lang.String;@ed63f
[Ljava.lang.String;@13f04a
[Ljava.lang.String;@1048c5d

2 个答案:

答案 0 :(得分:0)

你通过过滤它来删除标题的技术将正常工作。问题是你是如何尝试打印数组的。

Scala中的数组不会覆盖toString,因此当您尝试打印时,它使用默认的字符串表示形式,它只是名称和哈希码,通常不是很有用。

如果要打印数组,请先使用字符串上的mkString方法将其转换为字符串,或使用foreach(println)

a.foreach {array =>  println(array.mkString("[",", ","]")}

a.foreach {array => array.foreach{println}}

是否会打印出数组中的元素,以便您可以看到它们包含的内容。

请记住,在使用Spark时,在转换和操作中打印只能在本地模式下工作。移动到集群后,工作将在远程执行程序上完成,因此您将无法查看和控制它们的输出。

答案 1 :(得分:0)

val income_data = sc.textFile("file:///home/user/Documents/income_info.txt")

income_data.collect().drop(1)

创建RDD时,它将返回RDD[String],然后在其上collect()时将返回Array[String], drop(number of elements)是Array顶部的函数,用于从其中删除许多行RDD。