1

Я использую этот код, чтобы получить данные из улья в Spark:Spark: Как изменить DataFrame к LibSVM и выполнять логистическую регрессию

val hc = new org.apache.spark.sql.hive.HiveContext(sc) 
val MyTab = hc.sql("select * from svm_file") 

и я получаю DataFrame:

scala> MyTab.show() 
+--------------------+ 
|    line| 
+--------------------+ 
|0 2072:1 8594:1 7...| 
|0 8609:3 101617:1...| 
|   0 7745:2| 
|0 6696:2 9568:21 ...| 
|0 200076:1 200065...| 
|0 400026:20 6936:...| 
|0 7793:2 9221:7 1...| 
|0 4831:1 400026:1...| 
|0 400011:1 400026...| 
|0 200072:1 6936:1...| 
|0 200065:29 4831:...| 
|1 400026:20 3632:...| 
|0 400026:19 6936:...| 
|0 190004:1 9041:2...| 
|0 190005:1 100120...| 
|0 400026:21 6936:...| 
|0 190004:1 3116:3...| 
|0 1590:12 8594:56...| 
|0 3632:2 9240:1 4...| 
|1 400011:1 400026...| 
+--------------------+ 
only showing top 20 rows 

Как я могу преобразовать этот DataFrame в libSVM для выполнения логистической регрессии, как в этом примере: https://altiscale.zendesk.com/hc/en-us/articles/202627136-Spark-Shell-Examples?

ответ

1

Я бы сказал, не загружайте его в DataFrame в первую очередь, и просто использовать MLUtils.loadLibSVMFile но если по каким-то причинам это не на опции вы можете преобразовать в RDD[String] и использовать ту же логику карты, которые используются loadLibSVMFile

import org.apache.spark.sql.Row 
import org.apache.spark.mllib.regression.LabeledPoint 

MyTab 
    .map{ case Row(line: String) => line } 
    .map(_.trim) 
    .filter(line => !(line.isEmpty || line.startsWith("#"))) 
    .map { line => ??? } 

на месте ??? просто скопировать и вставить a relevant part of the loadLibSVMFile method

+0

Работает отлично, но можете ли вы рассказать мне, как я могу преобразовать его в «LabeledPoint»? Я пытаюсь с этим кодом: 'MyTabSVM.map (x => LabeledPoint (x._1, Vectors.sparse (?, X._2, x._3)))' , но я не уверен, что мне делать положить для аргумента '?'. – Maju116

+0

'MyTabSVM.map (_._ 2.max) .max + 1' – zero323

+0

Когда я пытаюсь запустить модель, я получаю следующую ошибку: ' org.apache.spark.SparkException: Работа прерывается из-за отказа этапа: Задача 0 на этапе 6.0 не удалась 4 раза, последний сбой: потерянная задача 0.3 в стадии 6.0 (TID 31, hdfs-58.hadoop.srv): java.lang.IllegalArgumentException: требование не выполнено: индексы должны быть однонаправленными и возрастающими order'. Он появляется, когда я хочу распечатать данные. Есть идеи? – Maju116

0

sklearn.datasets.dump_svmlight_file функция имеет параметр zero_based. По умолчанию это True. Это означает, что индексы начинаются с 0. Spark хочет, чтобы они начинались с 1. Итак: сделайте это False.