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:

  1. Para encontrar o caminho, para adicionar zeros (na verdade, não sei como inserir dados)
  2. 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?

Foi útil?

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"))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top