scala - 将数据帧转换为密集向量 Spark

标签 scala apache-spark dataframe apache-spark-sql

Acyally 正在开发 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.

我会非常感激。谢谢你们

最佳答案

您可以使用array函数,然后映射到LabeledPoint:

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])

关于scala - 将数据帧转换为密集向量 Spark ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427191/

相关文章:

python - 如何在 Pandas 中进行分组、计数然后绘制条形图?

java - scala.Some 无法转换为自定义对象

scala - 无形可扩展记录的相等性取决于字段顺序

apache-spark - K8s 上的 Spark : Job proceeds although some executors are still pending

performance - Cassandra vs HDFS 存储分析数据

scala - Spark : Override library method

scala - 丢弃已在 Play Framework 2.x 上设置的 header

java - Scala - 类被破坏了

scala - Spark 1.5.2 : Filtering a dataframe in Scala

python - 如何根据列表元素的条件拆分 Pandas Dataframe 中的列表列?