如何成对遍历大量数据帧并将值存储在 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,我认为这是非常庞大的。
我试过的:
- 上传数据文件到 HDFS
- 将数据作为数据帧读取
df.collect()
得到一个 array1 :array[Row]
- 成对遍历
array1
并计算距离
- 将
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
是action函数,df.collect()
会抛出Exception
java.lang.OutOf.MemoryError : Java heap space
。这可以避免吗?
- 一拿到
distance(rowi,rowj)
,我就想存起来,怎么办?
- 我可以将最终矩阵存储在 HDFS 中并在 python 中将其作为矩阵读取吗?
ps:如果以上都解决不了,我可以用什么新思路?
任何答案都会对我有很大帮助,谢谢!
检查 https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。 IndexedRowMatrix 类似于 RowMatrix,但具有有意义的行索引。
你可以根据这个 APi 设计你的算法。
您可以查看https://github.com/ma7555/evalify
(免责声明:我是所有者)
问题描述:
我有一个大约 35 米行 和 10 列 的数据集。
我想计算两行之间的距离,距离函数类似于distance(row1,row2)
,然后将值存储在一个巨大的矩阵中。
总共需要的操作将近6*10^15,我认为这是非常庞大的。
我试过的:
- 上传数据文件到 HDFS
- 将数据作为数据帧读取
df.collect()
得到一个array1 :array[Row]
- 成对遍历
array1
并计算距离 - 将
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
是action函数,df.collect()
会抛出Exceptionjava.lang.OutOf.MemoryError : Java heap space
。这可以避免吗?- 一拿到
distance(rowi,rowj)
,我就想存起来,怎么办? - 我可以将最终矩阵存储在 HDFS 中并在 python 中将其作为矩阵读取吗?
ps:如果以上都解决不了,我可以用什么新思路?
任何答案都会对我有很大帮助,谢谢!
检查 https://spark.apache.org/docs/latest/mllib-data-types.html#indexedrowmatrix IndexedRowMatrix。 IndexedRowMatrix 类似于 RowMatrix,但具有有意义的行索引。 你可以根据这个 APi 设计你的算法。
您可以查看https://github.com/ma7555/evalify
(免责声明:我是所有者)