transformando do formato de matriz nativo, escaldando
Pergunta
Então esta questão está relacionada à pergunta Transformando formato de matriz, escaldante
Mas agora quero fazer a operação nas costas.Então eu posso fazer isso da seguinte maneira:
Tsv(in, ('row, 'col, 'v))
.read
.groupBy('row) { _.sortBy('col).mkString('v, "\t") }
.mapTo(('row, 'v) -> ('c)) { res : (Long, String) =>
val (row, v) = res
v }
.write(Tsv(out))
Mas, aí, temos problema com zeros.Como sabemos, o escaldamento ignora campos de valores zero.Então, por exemplo, obtivemos a matriz:
1 0 8
4 5 6
0 8 9
No formato escaldante é:
1 1 1
1 3 8
2 1 4
2 2 5
2 3 6
3 2 8
3 3 9
Usando minha função que escrevi acima, só podemos obter:
1 8
4 5 6
8 9
E isso está incorreto.Então, como posso lidar com isso?Vejo duas variantes possíveis:
- Para encontrar o caminho, para adicionar zeros (na verdade, não sei como inserir dados)
- Escrever operações próprias em formato de matriz próprio (não é preferível, porque estou interessado em operações de matriz Scalding e não quero escrever todas elas sozinho)
Existem alguns métodos e posso evitar pular zeros na matriz?
Solução
Scalding armazena uma representação esparsa dos dados.Se você deseja gerar uma matriz densa (em primeiro lugar, que não será dimensionada, porque as linhas serão maiores do que cabem na memória em algum momento), você precisará enumerar todas as linhas e colunas:
// First, I highly suggest you use the TypedPipe api, as it is easier to get
// big jobs right generally
val mat = // has your matrix in 'row1, 'col1, 'val1
def zero: V = // the zero of your value type
val rows = IterableSource(0 to 1000, 'row)
val cols = IterableSource(0 to 2000, 'col)
rows.crossWithTiny(cols)
.leftJoinWithSmaller(('row, 'col) -> ('row1, 'col1), mat)
.map('val1 -> 'val1) { v: V =>
if(v == null) // this value should be 0 in your type:
zero
else
v
}
.groupBy('row) {
_.toList[(Int, V)](('col, 'val1) -> 'cols)
}
.map('cols -> 'cols) { cols: List[(Int, V)] =>
cols.sortBy(_._1).map(_._2).mkString("\t")
}
.write(TypedTsv[(Int, String)]("output"))