Вопрос

ОК, поэтому, в осаждении мы можем легко работать с матрицей, используя Matrix API, и это нормально - таким образом:

val matrix = Tsv(path, ('row, 'col, 'val))
  .read
  .toMatrix[Long,Long,Double]('row, 'col, 'val)
.

Но как я могу трансформировать матрицу в этот формат из формата, как мы обычно пишем?Есть ли элегантные способы?

1 2 3
3 4 5
5 6 7
.

к

1 1 1
1 2 2
1 3 3
2 1 3
2 2 4
2 3 5
3 1 5
3 2 6
3 3 7
.

Мне нужно это сделать операции на матрице с огромными размерами, и я не знаю количество строк и столбцов (можно дать размеры, если файл? NXM например).

Я пытался сделать Smth с TextLine( args("input") ), но я не знаю, как считать номер строки.Я хочу преобразовать матрицу на Hadoop, MB там есть другие способы справиться с форматом?Возможно ли сосредствование?

Это было полезно?

Решение

Ниже приведен ответ не мой, но ответ OP, который был задан на вопрос.


Вот что я сделал, что выводит то, что я хотел:

var prev: Long = 0
var pos: Long = 1

val zeroInt = 0
val zeroDouble = 0.0

TextLine( args("a") )
    .flatMap('line -> 'number)  { line : String => line.split("\\s+") }
    .mapTo(('offset, 'line, 'number) -> ('row, 'val)) { 
      (offset: Long, line: String, number: String) => 
        pos = if(prev == (offset + 1)) pos + 1 else 1
        prev = offset + 1
        (offset + 1, number) }
    .filter('row, 'col, 'v) { 
      (row: Long, col: String, v: String) => 
        val (row, col, v) = line
        (v != zeroInt.toString) && (v != zeroDouble.toString) }
    .write(Tsv(args("c")))
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top