2017-04-07 48 views
3

我從使用sc.textFile()的Mahout中的Alluxio中獲取數據,但它是spark RDD。我的程序進一步使用這個火花RDD作爲Mahout DRM,因此我需要將RDD轉換爲DRM。所以我現在的代碼保持穩定。如何將火花RDD轉換爲mahout DRM?

回答

2

一個Apache亨利馬烏DRM可從Apache火花RDD在下面的步驟中創建:

  1. 轉換的RDD的每一行成亨利馬烏矢量
  2. 拉鍊的RDD與指數(和交換,以便該元組的形式是(Long, Vector)
  3. 包住RDD與DRM的

考慮以下示例代碼:

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

與數據轉換的主要問題往往是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

+0

有關如何的RDD變換成IDS請參閱 [本要旨](https://gist.github.com/rawkintrevo/c1bb00896263bdc067ddcd8299f4794c)的示例 – rawkintrevo