Scala 数据帧转换为密集向量火花

Scala 数据帧转换为密集向量火花,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,我正在研究spark 2.0.2 例如,我想知道如何基于Spark ML进行逻辑回归。我想将数据帧的每一行放入一个向量中,该向量将被输入逻辑回归。您能否帮助获取数据帧中的行结果,以将每一行放入一个密集向量中。谢谢。这里是我为获取数据帧所做的工作 import org.apache.spark.ml.classification.LogisticRegression import org.apache.spark.ml.linalg.{Vector, Vectors} import org.apa

我正在研究spark 2.0.2 例如,我想知道如何基于Spark ML进行逻辑回归。我想将数据帧的每一行放入一个向量中,该向量将被输入逻辑回归。您能否帮助获取数据帧中的行结果,以将每一行放入一个密集向量中。谢谢。这里是我为获取数据帧所做的工作

import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.linalg.{Vector, Vectors}
import org.apache.spark.ml.param.ParamMap
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.Row
import org.apache.hadoop.fs.shell.Display

object Example extends App {
val sparkSession = SparkSession.builder.master("local").appName("my-spark-app").getOrCreate()
val data=sparkSession.read.option("header", "true").csv("C://sample_lda_data.csv").toDF()
val data2=data.select("col2","col3","col4","col5","col6","col7","col8","col9")
最后,我想得到这样的东西作为逻辑回归的输入 在第一个位置,它将是数据框的第一列。请提供帮助

val data=sparkSession.read.option("header", "true").csv("C://sample_lda_data.csv").toDF()
val data2=data.select("col2","col3","col4","col5","col6","col7","col8","col9")
val assembler = new VectorAssembler().setInputCols(Array("col2", "col3", "col4")).setOutputCol("features")
val output = assembler.transform(data2)

main" java.lang.IllegalArgumentException: Data type StringType is not supported.

我非常感激。谢谢大家

你们可以使用
数组
函数,然后映射到
标签点
s:

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.DoubleType

// create an array column from all but first one:
val arrayCol: Column = array(df.columns.drop(1).map(col).map(_.cast(DoubleType)): _*)

// select array column and first column, and map into LabeledPoints
val result: Dataset[LabeledPoint] = df.select(col("col1").cast(DoubleType), arrayCol)
  .map(r => LabeledPoint(
    r.getAs[Double](0),
    Vectors.dense(r.getAs[mutable.WrappedArray[Double]](1).toArray)
  ))

// You can use the Dataset or the RDD
result.show()
// +-----+---------------------+
// |label|features             |
// +-----+---------------------+
// |1.0  |[2.0,3.0,4.0,0.5]    |
// |11.0 |[12.0,13.0,14.0,15.0]|
// |21.0 |[22.0,23.0,24.0,25.0]|
// +-----+---------------------+

result.rdd.foreach(println)
// (1.0,[2.0,3.0,4.0,0.5])
// (21.0,[22.0,23.0,24.0,25.0])

你可以用。@mtoto我用了你说的,我编辑了代码,我得到了这个错误“java.lang.IllegalArgumentException:不支持数据类型StringType。任何帮助您所有的COL都应该是数字的。请您使用thnx的导入包是什么。我正在再次尝试您的代码thnx。我的朋友是scala和spark的新手,我收到一个错误,告诉我$事先不是StringContext thnx的成员,这是另一个缺少的导入(
import sparkSession.implicits.\u
),添加该导入或将
$“col1”
替换为
col(“col1”)
嗨,我的朋友,我不知道如何感谢你。但是你能帮我一个忙吗,如何修改你的代码以将我的数据转换为双精度?非常感谢,“我不知道如何感谢你”-这就是“接受”按钮的作用;)要将列转换为double,您可以使用
cast(DoubleType)
-我再次更新了答案,尽管我建议您只阅读DataFrame文档,它就在那里-我不会根据您的要求继续编辑答案。。。
I have wrote code to convert dataframe's numeric columns into dense vector. Please find below code. Note: here col1 and col2 are numeric type columns.

import sparksession.implicits._;
   val result: Dataset[LabeledPoint] = df.map{ x => LabeledPoint(x.getAs[Integer]("Col1").toDouble, Vectors.dense(x.getAs[Double]("col2"))) }
   result.show();
result.printSchema();

+-------+----------+
|  label|  features|
+-------+----------+
|31825.0| [75000.0]|
|58784.0| [24044.0]|
|  121.0| [41000.0]|

root
 |-- label: double (nullable = true)
 |-- features: vector (nullable = true)