使用Scala读取位置文件的动态方法

时间:2017-05-04 10:20:22

标签: scala apache-spark

我可以通过静态下面的代码帮助读取位置/固定长度文件。但我需要使它像动态一样 - 我们需要将文件位置和文件名作为参数传递。

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 个答案:

答案 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))