如何成对遍历大量数据帧并将值存储在 n*n 矩阵中?

how to traverse a massive dataframe pair-wisely and store the value in a n*n matrix?

问题描述:

我有一个大约 35 米行10 列 的数据集。

我想计算两行之间的距离,距离函数类似于distance(row1,row2),然后将值存储在一个巨大的矩阵中。

总共需要的操作将近6*10^15,我认为这是非常庞大的。

我试过的:

  1. 上传数据文件到 HDFS
  2. 将数据作为数据帧读取
  3. df.collect() 得到一个 array1 :array[Row]
  4. 成对遍历array1并计算距离
  5. distance(rowi,rowj) 存储在 matrix(i,j)

Scala 代码:

val array1 = df.collect()
val l = array1.length 
for(i <-0 until array.length){
    for(j <-i+1 until array.length){
             val vd = Vectors.dense(i,j,distance(array(i),array(j)))

我想像上面那样将每个值保存在Vector中,并将其添加到RDD/Dataframe。

但我搜索的唯一方法是使用 union。我认为它不够好。

所以需要解决三个问题:

  1. collect是action函数,df.collect()会抛出Exception java.lang.OutOf.MemoryError : Java heap space。这可以避免吗?
  2. 一拿到distance(rowi,rowj),我就想存起来,怎么办?
  3. 我可以将最终矩阵存储在 HDFS 中并在 python 中将其作为矩阵读取吗?

ps:如果以上都解决不了,我可以用什么新思路?

任何答案都会对我有很大帮助,谢谢!

检查 https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。 IndexedRowMatrix 类似于 RowMatrix,但具有有意义的行索引。 你可以根据这个 APi 设计你的算法。

您可以查看https://github.com/ma7555/evalify(免责声明:我是所有者)