Apache spark Spark:如何将DataFrame更改为LibSVM并执行逻辑回归

Apache spark Spark:如何将DataFrame更改为LibSVM并执行逻辑回归,apache-spark,dataframe,apache-spark-sql,logistic-regression,libsvm,Apache Spark,Dataframe,Apache Spark Sql,Logistic Regression,Libsvm,我正在使用以下代码将数据从Hive获取到Spark: val hc = new org.apache.spark.sql.hive.HiveContext(sc) val MyTab = hc.sql("select * from svm_file") 我得到了数据帧: scala> MyTab.show() +--------------------+ | line| +--------------------+ |0 2072:1 8594:1 7...

我正在使用以下代码将数据从Hive获取到Spark:

val hc = new org.apache.spark.sql.hive.HiveContext(sc)
val MyTab = hc.sql("select * from svm_file")
我得到了数据帧:

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

如何将此数据帧转换为libSVM以执行逻辑回归,如本例所示:?

我会说,首先不要将其加载到
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 => ??? }

只需复制并粘贴即可代替
sklearn.datasets.dump\u svmlight\u file
函数有一个名为
zero\u-based
的参数。默认情况下,它是
True
。这意味着指数将从0开始。Spark希望他们从1开始。所以:将其设置为
False

工作非常完美,但您能告诉我如何将其转换为
标签点
?我正在尝试使用以下代码:
MyTabSVM.map(x=>LabeledPoint(x.\u 1,Vectors.sparse(?,x.\u 2,x.\u 3))
但我不确定应该为
参数设置什么。
MyTabSVM.map(\u.\u 2.max).max+1
当我尝试运行模型时,我得到以下错误:
org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段6.0中的任务0失败4次,最近的失败:阶段6.0中的任务0.3丢失(TID 31,hdfs-58.hadoop.srv):java.lang.IllegalArgumentException:需求失败:索引应以一为基础,并按升序排列
。当我想要打印数据时,它会出现。有什么想法吗?这表明你有一些格式不正确的条目,但没有额外的条目,我只能猜测。如果你的
要求失败:索引应该是基于一的,并按升序排列
错误,那么要么(1)你的向量维度没有按升序排列,要么(2)您的维度索引从
0
开始,而不是从
1