Как конвертировать искровой RDD в mahout DRM?
Я получаю данные из Alluxio в Mahout, используя sc.textFile(), но это искра RDD. Моя программа также использует этот искровой RDD как Mahout DRM, поэтому мне нужно было конвертировать RDD в DRM. Так что мой текущий код остается стабильным.
2 ответа
Apache Mahout DRM может быть создан из RDD Apache Spark в следующие шаги:
- Конвертировать каждый ряд СДР в вектор Mahout
- Заархивируйте СДР с Индексом (и поменяйте местами, чтобы кортеж имел форму
(Long, Vector)
- Оберните 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] элементов для матрицы, это сделает преобразование. Если у вас есть массив строк, вы можете начать с этого, чтобы кодировать свое собственное преобразование.