2016-12-08 117 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