Jestem w stanie odczytać plik o położeniu pozycyjnym / o ustalonej długości przy pomocy statycznego kodu podanego poniżej. Ale muszę go uczynić dynamicznym jak - musimy podać pozycję pliku i nazwy pliku jako parametru.
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()))
Każda pomoc jest wysoko ceniona.
Odpowiedzi:
1 dla odpowiedzi № 1Po pierwsze, zalecam użycie metody dzielenia rzędu w kilku punktach:
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)
}
To pozwoli ci to zrobić splitAtLengths(l, List(3, 10, 5)).map(_.trim)
aby wymienić to, co masz w swoim map
.
Teraz wystarczy podać odpowiednie parametry do swojej funkcji:
def positionalFileReading(inputFilePath: String, cellLengths: List[Int]) = spark.read.textFile(inputFilePath).rdd.
map(l => splitAtLengths(l, cellLengths).map(_.trim))