HDFS 如何成对地遍历大量 Dataframe 并将值存储在n*n矩阵中?

f8rj6qna  于 2022-12-09  发布在  HDFS
关注(0)|答案(2)|浏览(164)

问题描述:

我有一个数据集,大约有 *35百万行 * 和 *10列
我想计算两行之间的距离,其距离函数类似于distance(row1,row2),然后将值存储在一个巨大的矩阵中。
总共需要做的操作将近 610^15
,我觉得非常庞大。

我尝试过的

1.将数据文件上载到HDFS
1.读取数据作为 Dataframe

  1. df.collect()并获得array1 :array[Row]
    1.两两遍历array1并计算距离
    1.将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是一个操作函数,df.collect()将抛出异常java.lang.OutOf.MemoryError : Java heap space。是否可以避免这种情况?
    1.一旦我得到一个distance(rowi,rowj),我想存储它,如何?
    1.我可以将最终的矩阵存储在HDFS中并在python中将其作为矩阵读取吗?
    ps:如果以上都不能解决,我可以用什么新的想法?
    任何答案都会对我有很大帮助,谢谢!
hujrc8aj

hujrc8aj1#

查看https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。IndexedRowMatrix类似于RowMatrix,但具有有意义的行索引。您可以基于此API设计您的算法。

v2g6jxz6

v2g6jxz62#

您可以检查https://github.com/ma7555/evalify(免责声明:我是业主)

相关问题