2016-12-08 31 views
0

我使用下面的代码来获取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 

我不知道我缺少什么。

+0

我不明白'_.split( “/”)takeRight(1)。 mkString( “|”)'。 'takeRight(1)'总是返回一个包含单个元素的集合,为什么要使用'mkString'?如果你的意图是采取最后的元素,并制作一个字符串,我会'_.split(“/”)。last.toString' –

+0

@ evan058我试过你的方式'_.split(“/”)。 last.toString'但仍然得到相同的结果。 – animal

+0

这是一个普遍的建议,它不应该改变结果 –

回答

1

关键的问题是,在一个RDD一个map返回一个指向一个新的RDD你的情况

在这里,您filenmeRDD,和你做:

​​

其中map变换的RDD完成,使您的nameoffile也是一个RDD

解决方案:

您必须对您的应用操作为了得到一个非RDD值:

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

这里nameoffileString,其值是File8.HL7

+0

谢谢你解决了我的问题。非常感谢您的详细解释。 – animal

+0

请upvote我的问题。 – animal

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) 
+0

我试过你的代码,但是我得到'OBR_ [Ljava.lang.String; @ 1e9b706f'而不是File8.HL7 – animal

+0

@animal不要忘记'collect'后的'head'调用。 'collect'返回一个数组 – puhlen