2017-05-04 1 views
1

Ich bin in der Lage, Datei mit fester/örtlicher Länge mit Hilfe des unten stehenden Codes statisch zu lesen.aber ich muss es dynamisch machen wie- wir müssen die Position der Datei und des Dateinamens übergeben ein ParameterDynamische Möglichkeit, Positionsdatei mit Scala zu lesen

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()))  

Jede Hilfe wird sehr geschätzt.

Antwort

1

Zuerst würde ich empfehlen, ein Verfahren mit Ihrer Reihe an mehreren Stellen zu spalten:

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) 
} 

Dies ermöglicht es Ihnen splitAtLengths(l, List(3, 10, 5)).map(_.trim) zu tun, um zu ersetzen, was Sie in Ihrem map haben.

Nun, man muss nur die entsprechenden Parameter an die Funktion geben müssen:

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

Durch obige Verfahren unter Verwendung Ich kann die Positionsdatei lesen, aber außer Betrieb gesetzt ist nicht wie erwartet Ausgabe in einzelnen Spalte gegeben Ich möchte es auf verschiedenen Spalten von Datenrahmen: - aktuelle op: | Wert | [56, Apfel, TRUE, 0,56] [45, Birne, FALSCH, 1,34] OP- erforderlich | _1 | _2 | _3 | _4 | | 56 | Apfel | WAHR | 0,56 | | 45 | Birne | FALSE | 1.34 | –

Verwandte Themen