我可以通过静态下面的代码帮助读取位置/固定长度文件。但我需要使它像动态一样 - 我们需要将文件位置和文件名作为参数传递。
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()))
非常感谢任何帮助。
答案 0 :(得分: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))