繁体   English   中英

将Spark数据帧转换为org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg.Vector]

[英]Convert Spark Data Frame to org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]

我对Scala和Spark 2.1非常陌生。 我正在尝试计算数据帧中许多元素之间的相关性,如下所示:

item_1 | item_2 | item_3 | item_4
     1 |      1 |      4 |      3
     2 |      0 |      2 |      0
     0 |      2 |      0 |      1

这是我尝试过的:

val df = sqlContext.createDataFrame(
  Seq((1, 1, 4, 3),
      (2, 0, 2, 0),
      (0, 2, 0, 1)
).toDF("item_1", "item_2", "item_3", "item_4")


val items = df.select(array(df.columns.map(col(_)): _*)).rdd.map(_.getSeq[Double](0))

元素之间的计算相关性:

val correlMatrix: Matrix = Statistics.corr(items, "pearson")

随着以下错误消息:

<console>:89: error: type mismatch;
found   : org.apache.spark.rdd.RDD[Seq[Double]]
 required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]
       val correlMatrix: Matrix = Statistics.corr(items, "pearson")

我不知道如何从数据帧创建org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]

这可能是一个非常容易的任务,但我对此颇为挣扎,对于任何建议我都很高兴。

例如,您可以使用VectorAssembler 组合向量并转换为RDD

import org.apache.spark.ml.feature.VectorAssembler

val rows = new VectorAssembler().setInputCols(df.columns).setOutputCol("vs")
  .transform(df)
  .select("vs")
  .rdd

Row提取Vectors

  • Spark 1.x:

     rows.map(_.getAs[org.apache.spark.mllib.linalg.Vector](0)) 
  • Spark 2.x:

     rows .map(_.getAs[org.apache.spark.ml.linalg.Vector](0)) .map(org.apache.spark.mllib.linalg.Vectors.fromML) 

关于您的代码:

  • 您的Integer列不是Double
  • 数据不是array因此您不能使用_.getSeq[Double](0)

如果您的目标是执行皮尔逊相关,则实际上不必使用RDD和Vector。 这是一个直接在DataFrame列(有问题的列是Doubles类型)上进行梨子相关的示例。

码:

import org.apache.spark.sql.{SQLContext, Row, DataFrame}
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, DoubleType}
import org.apache.spark.sql.functions._


val rb = spark.read.option("delimiter","|").option("header","false").option("inferSchema","true").format("csv").load("rb.csv").toDF("name","beerId","brewerId","abv","style","appearance","aroma","palate","taste","overall","time","reviewer").cache()

rb.agg(
    corr("overall","taste"),
    corr("overall","aroma"),
    corr("overall","palate"),
    corr("overall","appearance"),
    corr("overall","abv")
    ).show()

在此示例中,我要导入一个数据框(具有自定义定界符,无标头和推断的数据类型),然后简单地对其中具有多个相关性的数据框执行agg函数。



输出:

+--------------------+--------------------+---------------------+-------------------------+------------------+
|corr(overall, taste)|corr(overall, aroma)|corr(overall, palate)|corr(overall, appearance)|corr(overall, abv)|
+--------------------+--------------------+---------------------+-------------------------+------------------+
|  0.8762432795943761|   0.789023067942876|   0.7008942639550395|       0.5663593891357243|0.3539158620897098|
+--------------------+--------------------+---------------------+-------------------------+------------------+

从结果中可以看出,(总体,口味)列之间的相关性很高,而(总体,绝对值)列的相关性则不高。

这是Scala Docs DataFrame页面的链接,该页面具有Aggregation Correlation Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM