spark scala中的文件名显示错误的结果

时间:2016-12-08 16:28:39

标签: scala apache-spark rdd

我正在使用下面的代码来获取Apache Spark中文件的名称,但是当我将其附加到RDD[string]时,我的价值会有所不同。

以下是我的代码:

import org.apache.spark.rdd.RDD

val text: RDD[String] = sc.textFile("/user/cloudera/File8.HL7").coalesce(1)

var obrInd = 0

val filenme: RDD[String] = sc.wholeTextFiles("/user/cloudera/File8.HL7").map { case (filename, content) => filename}

var nameoffile = filenme.map(_.split("/").takeRight(1).mkString("|"))

nameoffile.collect().foreach(println) 

val result: RDD[String] = text.mapPartitions{part =>
        part.map{r => 
        if(code == "OBR")
        r + "|OBR_"+ nameoffile
    }
}
result.collect().foreach(println)

以下是我的输出

OBR|1||OBR_MapPartitionsRDD[110] at
OBX|1||OBR_MapPartitionsRDD[110] at
OBX|2||OBR_MapPartitionsRDD[110] at    
OBX|3||OBR_MapPartitionsRDD[110] at
OBX|4||OBR_MapPartitionsRDD[110] at

预期输出:

OBR|1||OBR_File8.HL7
OBX|1||OBR_File8.HL7
OBX|2||OBR_File8.HL7   
OBX|3||OBR_File8.HL7
OBX|4||OBR_File8.HL7

但输出

scala> nameoffile.collect().foreach(println)

File8.HL7

我不知道自己错过了什么。

2 个答案:

答案 0 :(得分:1)

关键问题是map上的RDD会返回指向新RDD的指针。

在您的情况下,您的filenmeRDD,您做到了:

var nameoffile = filenme.map(_.split("/").takeRight(1).mkString("|"))

map上进行了RDD转换,这使nameoffile也成为RDD

<强>解决方案:

您必须对RDD应用操作才能获得非RDD值:

var nameoffile = filenme.map(_.split("/").takeRight(1)(0)).take(1)(0)

此处nameoffileString,其值为File8.HL7

答案 1 :(得分:0)

import org.apache.spark.rdd.RDD

val text: RDD[String] = sc.textFile("/user/cloudera/File8.HL7").coalesce(1)

var obrInd = 0

val filenme: RDD[String] = sc.wholeTextFiles("/user/cloudera/File8.HL7").map { case (filename, content) => filename}

var nameoffile = filenme.map(_.split("/").takeRight(1)).collect().head

println(nameoffile) 

val result: RDD[String] = text.mapPartitions{part =>
        part.map{r => 
        if(code == "OBR")
        r + "|OBR_"+ nameoffile
    }
}
result.collect().foreach(println)