Question

Ok, donc, en échaudage, nous pouvons facilement travailler avec la matrice, en utilisant l'API matricielle, et c'est ok - de cette manière :

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

Mais comment puis-je transformer la matrice en ce format à partir du format, comme nous l'écrivons habituellement ?Existe-t-il des manières élégantes ?

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

J'en ai besoin pour effectuer des opérations sur des matrices de tailles énormes, et je ne connais pas le nombre de lignes et de colonnes (il est possible de donner des tailles si fichier ?NxM par exemple).

J'ai essayé de faire quelque chose avec TextLine( args("input") ) mais je ne sais pas comment compter le numéro de ligne.Je veux convertir la matrice sur Hadoop, mb existe-t-il d'autres façons de gérer le format ?Est-ce possible avec des brûlures ?

Était-ce utile?

La solution

La réponse ci-dessous n'est pas la mienne mais la réponse d'OP, qui a été posée dans la question.


Voici ce que j'ai fait, qui donne ce que je voulais :

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")))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top