2017-05-04 25 views
1

我可以通過靜態方式在下面的代碼中讀取位置/固定長度的文件,但我需要使它像動態一樣 - 我們需要將文件和文件名的位置作爲一個參數。用Scala讀取位置文件的動態方式

val positionalFileReading = spark.read.textFile(inputFilePath).rdd 
    .map(l => (l.substring(0, 3).trim(), l.substring(3, 13).trim(), 
      l.substring(13,18).trim(), l.substring(18,22).trim()))  

任何幫助,高度讚賞。

回答

1

首先,我建議你使用的方法在幾個點來分割你行:

def splitAtLengths(row: String, lengths: List[Int], acc: List[String] = Nil): List[String] = lengths match { 
    case Nil => acc.reverse 
    case n :: ls => 
    val (first, rest) row.splitAt(n) 
    splitAtLengths(rest, ls, first :: acc) 
} 

這將允許你這樣做splitAtLengths(l, List(3, 10, 5)).map(_.trim)取代你在你的map。現在

,你只要給相關參數的功能:

def positionalFileReading(inputFilePath: String, cellLengths: List[Int]) = spark.read.textFile(inputFilePath).rdd. 
    map(l => splitAtLengths(l, cellLengths).map(_.trim)) 
+0

通過使用上面的方法,我能夠讀取的位置文件,但出來把不作爲單獨的專欄中,我想給出預期的輸出它位於數據幀的不同列上: - 當前操作: |值| [56,蘋果,TRUE,0.56] [45,梨,FALSE,1.34]需要 OP- | _1 | _2 | _3 | _4 | | 56 |蘋果| TRUE | 0.56 | | 45 |梨| FALSE | 1.34 | –