问题描述:
我有一个大约 35毫米行和 10列的数据集。
我想计算两行之间的距离,其距离函数如distance(row1,row2)
,然后将值存储在一个巨大的矩阵中。
完全需要的操作几乎 6 * 10 ^ 15 ,我认为这是非常巨大的。
我尝试了什么:
df.collect()
并获得array1 :array[Row]
array1
并计算距离distance(rowi,rowj)
存储在矩阵(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
。这可以避免吗?distance(rowi,rowj)
,我想存储它,怎么样?ps:如果首先无法解决,我可以使用哪种新想法?
任何答案都会对我有所帮助,谢谢!
答案 0 :(得分:0)
检查https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。 IndexedRowMatrix类似于RowMatrix但具有有意义的行索引。 您可以根据此APi设计算法。