从本机矩阵格式转换,烫伤

mcdcgff0  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(442)

所以这个问题涉及到问题转换矩阵格式,烫伤
但是现在,我想做背部手术。所以我可以这样做:

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

但是,在那里,我们遇到了零的问题。如我们所知,滚烫跳过零值字段。例如我们得到了矩阵:

1   0   8   
4   5   6   
0   8   9

格式如下:

1   1   1
1   3   8
2   1   4
2   2   5
2   3   6
3   2   8
3   3   9

使用我上面写的函数,我们只能得到:

1   8
4   5   6
8   9

这是不正确的。那么,我该怎么处理呢?我看到两种可能的变体:
找到方法,加零(实际上,不知道如何插入数据)
以自己的矩阵格式编写自己的操作(这是不可预测的,因为我对滚烫的矩阵操作感兴趣,不想自己编写所有的操作)
有没有一些方法,我可以避免跳过矩阵中的零?

j13ufse2

j13ufse21#

烫伤存储数据的稀疏表示。如果要输出密集矩阵(首先,它不会缩放,因为行在某个点上会超出内存的容量),则需要枚举所有行和列:

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

相关问题