Как конвертировать искровой RDD в mahout DRM?

Я получаю данные из Alluxio в Mahout, используя sc.textFile(), но это искра RDD. Моя программа также использует этот искровой RDD как Mahout DRM, поэтому мне нужно было конвертировать RDD в DRM. Так что мой текущий код остается стабильным.

2 ответа

Apache Mahout DRM может быть создан из RDD Apache Spark в следующие шаги:

  1. Конвертировать каждый ряд СДР в вектор Mahout
  2. Заархивируйте СДР с Индексом (и поменяйте местами, чтобы кортеж имел форму (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)

Источник / дополнительная информация / Бесстыдное самореклама (ближе к концу): мой блог

Основная проблема с преобразованием данных заключается в том, что Mahout использует целые числа для ссылки на номера строк и столбцов общей матрицы, но данные обычно имеют свои собственные ключи строк и столбцов, которые являются идентификаторами строк некоторого вида.

Mahout имеет объект под названием IndexedDatasetSpark который сохраняет идентификаторы в BiMaps (на самом деле BiDictionaries) но также создает Mahout DRM. Преимущество заключается в том, что словари будут преобразовывать целые числа для строк и столбцов обратно в ваши идентификаторы после выполнения математических операций.

Если у вас есть RDD[String, String] элементов для матрицы, это сделает преобразование. Если у вас есть массив строк, вы можете начать с этого, чтобы кодировать свое собственное преобразование.

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

Другие вопросы по тегам