2017-05-04 17 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) 
} 

これはあなたがあなたのmapに持っているものを置き換えるためにsplitAtLengths(l, List(3, 10, 5)).map(_.trim)を行うことができます。

さて、あなたは自分の機能に関連するパラメータを与えることがあります。

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

法上使用することにより、私は、位置のファイルを読み取ることができていますが、期待される出力が1列に与えられたようプット外ではありません、私が欲しいですそれはデータフレームとは異なる列にあります: - 現在の演算子: |値| OP-必要 [56、アップル、TRUE、0.56] [45、梨、FALSE、1.34] | _1 | _2 | _3 | _4 | | 56 |リンゴ| TRUE | 0.56 | | 45 | pear | FALSE | 1.34 | –

関連する問題