如何将scala中的densematrix转换为scalaDataframe?

kcrjzv8t  于 2021-07-09  发布在  Spark
关注(0)|答案(0)|浏览(222)

我正在尝试使用breeze包在scala中获取pysparkDataframe的逆(我在pyspark中找不到任何逆的实现,所以不得不在databricks中使用scala)。我正在使用创建Dataframe的临时视图 registerTempTable 并将Dataframe传递给scala,scala使用breeze包得到相反的结果。
我面临的问题是densematrix返回的是相反的结果。我需要将它转换成scalaDataframe,这样我就可以再次创建一个 createOrReplaceTempView 把table递过来,用Pypark读。
我怎么能做到呢?
这是我试过的代码。


# creating a pyspark dataframe and saving it to a temp_table

from pyspark.sql.types import StructType,StructField, DoubleType
data2 = [(1.0,3.0),
    (2.0,4.0),
  ]

schema = StructType([ \
    StructField("A",DoubleType(),True), \
    StructField("B",DoubleType(),True)\
  ])

df = spark.createDataFrame(data=data2, schema=schema)
df.coalesce(1)
df.printSchema()
df.show(truncate=False)
df.registerTempTable("temp_table")

利用scala-breeze运算求逆

%scala

import scala.util.Random
import breeze.linalg.DenseMatrix
import breeze.linalg.inv

val featuresDF = table("temp_table")

var FeatureArray: Array[Array[Double]] = Array.empty
val features = featuresDF.columns

for(i <- features.indices){
    FeatureArray = FeatureArray :+ featuresDF.select(features(i)).collect.map(_(0).toString).map(_.toDouble)
}

val desnseMat = DenseMatrix(FeatureArray: _*).t
val inverse = inv(desnseMat)
println(inverse)

相反的是密度矩阵。我希望它是dataframe的形式,我可以用它创建一个可以被pyspark访问的表。
我尝试的方法是。

val c = inverse.toArray.toSeq
val matrix = c.toDF("mat")
matrix.createOrReplaceTempView("matrix_df")

但这会返回一个长格式的Dataframe,因为我正在将它转换为一个序列。这是我能想到的最好的了。但是我需要Dataframe是宽格式(不是长格式)。我应该如何在scala本身的宽Dataframe中转换反向densematrix?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题