我使用下面的代码来获取Apache Spark中文件的名称,但是当我将它附加到RDD[string]
中时,我获得了不同的价值。火花scala中的文件名显示错误的结果
下面是我的代码:
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
我不知道我缺少什么。
我不明白'_.split( “/”)takeRight(1)。 mkString( “|”)'。 'takeRight(1)'总是返回一个包含单个元素的集合,为什么要使用'mkString'?如果你的意图是采取最后的元素,并制作一个字符串,我会'_.split(“/”)。last.toString' –
@ evan058我试过你的方式'_.split(“/”)。 last.toString'但仍然得到相同的结果。 – animal
这是一个普遍的建议,它不应该改变结果 –