如何将spark RDD转换为mahout DRM?

时间:2017-04-07 05:16:33

标签: apache-spark mahout alluxio

我使用sc.textFile()从Mahout中的Alluxio获取数据,但它是spark RDD。我的程序进一步使用这个spark RDD作为Mahout DRM,因此我需要将RDD转换为DRM。所以我目前的代码保持稳定。

2 个答案:

答案 0 :(得分:2)

可以通过以下步骤从Apache Spark RDD创建Apache Mahout DRM:

  1. 将RDD的每一行转换为Mahout Vector
  2. 使用索引将RDD压缩(并交换以使元组的格式为(Long, Vector)
  3. 使用DRM包装RDD。
  4. 请考虑以下示例代码:

    val rddA = sc.parallelize(Array((1.0, 2.0, 3.0),
                ( 2.0, 3.0, 4.0),
                ( 4.0, 5.0, 6.0)))
    
    val drmRddA: DrmRdd[Long] = rddA.map(a => new DenseVector(a))
                     .zipWithIndex()
                     .map(t => (t._2, t._1))
    
    val drmA = drmWrap(rdd= drmRddA)
    

    来源/更多信息/无耻的自我推销(底部):my Blog

答案 1 :(得分:1)

转换数据的主要问题通常是Mahout使用整数来引用一般矩阵的行号和列号,但数据通常有自己的行和列键,这些键是某种字符串ID。

Mahout有一个名为IndexedDatasetSpark的对象,该对象会在BiMaps(实际为BiDictionaries)中保留ID,但也会创建一个Mahout DRM。好处是字典会在数学完成后将行和列的整数转换回ID。

如果你有一个矩阵元素的RDD [String,String],那么这将进行转换。如果您有一组行,您可以从此开始编码您自己的转换。

https://github.com/apache/mahout/blob/master/spark/src/main/scala/org/apache/mahout/sparkbindings/indexeddataset/IndexedDatasetSpark.scala#L75