我正在使用下面的代码来获取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
我不知道自己错过了什么。
答案 0 :(得分:1)
关键问题是map
上的RDD
会返回指向新RDD
的指针。
在您的情况下,您的filenme
是RDD
,您做到了:
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)
此处nameoffile
是String
,其值为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)