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

Spark: How change DataFrame to LibSVM and perform logistic regression

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

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 ?

我会说不要首先将它加载到 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

sklearn.datasets.dump_svmlight_file 函数有一个名为 zero_based 的参数。默认为 True。这意味着索引将从 0 开始。Spark 希望它们从 1 开始。因此:使其成为 False