Pregunta

OK, por lo que, en el escaldado, podemos trabajar fácilmente con la matriz, utilizando la API de Matrix, y está bien, de manera similar:

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

Pero, ¿cómo puedo transformar la matriz a ese formato, como generalmente escribimos?¿Hay algunas maneras elegantes?

1 2 3
3 4 5
5 6 7

a

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

Necesito esto para hacer operaciones en matriz con enormes tamaños, y no conozco el número de filas y columnas (es posible dar tamaños si el archivo? NXM por ejemplo).

Intenté hacer smth con TextLine( args("input") ) pero no sé cómo contar el número de línea.Quiero convertir la matriz en Hadoop, MB ¡Hay otras formas en cómo tratar con el formato?¿Es posible con el escaldado?

¿Fue útil?

Solución

La respuesta a continuación no es mía, pero la respuesta de OP, que se puso en la pregunta.


Esto es lo que he hecho, lo que produce lo que quería:

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")))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top