问题描述:
我有一个数据集,大约有 *35百万行 * 和 *10列 。
我想计算两行之间的距离,其距离函数类似于distance(row1,row2)
,然后将值存储在一个巨大的矩阵中。
总共需要做的操作将近 610^15,我觉得非常庞大。
我尝试过的
1.将数据文件上载到HDFS
1.读取数据作为 Dataframe
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
。我认为这还不够好。
因此,有三个问题需要解决:
collect
是一个操作函数,df.collect()
将抛出异常java.lang.OutOf.MemoryError : Java heap space
。是否可以避免这种情况?
1.一旦我得到一个distance(rowi,rowj)
,我想存储它,如何?
1.我可以将最终的矩阵存储在HDFS中并在python中将其作为矩阵读取吗?
ps:如果以上都不能解决,我可以用什么新的想法?
任何答案都会对我有很大帮助,谢谢!
2条答案
按热度按时间hujrc8aj1#
查看https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。IndexedRowMatrix类似于RowMatrix,但具有有意义的行索引。您可以基于此API设计您的算法。
v2g6jxz62#
您可以检查
https://github.com/ma7555/evalify
(免责声明:我是业主)