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

时间:2018-03-10 13:48:38

标签: pyspark hdfs spark-dataframe apache-spark-mllib

问题描述:

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

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

完全需要的操作几乎 6 * 10 ^ 15 ,我认为这是非常巨大的。

我尝试了什么:

  1. 将数据文件上传到HDFS
  2. 将数据读取为dataframe
  3. df.collect()并获得array1 :array[Row]
  4. 成对遍历array1并计算距离
  5. distance(rowi,rowj)存储在矩阵(i,j)
  6. 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。这可以避免吗?
    2. 一旦我得到distance(rowi,rowj),我想存储它,怎么样?
    3. 我可以将最终矩阵存储在HDFS中并在python中将其作为矩阵读取吗?
    4. ps:如果首先无法解决,我可以使用哪种新想法?

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

1 个答案:

答案 0 :(得分:0)

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