如何将Scala中的DenseMatrix转换为Scala数据帧?

2024-04-27 18:17:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用breeze包在scala中获得Pyspark数据帧的反转(我在Pyspark中找不到任何反转的实现,因此不得不在databricks中使用scala)。我正在使用registerTempTable创建数据帧的临时视图,并将数据帧传递给scala,scala使用breeze包获得相反的结果

我面临的问题是DenseMatrix中返回的是相反的结果。我需要以某种方式将其转换为scala数据帧,以便再次创建一个createOrReplaceTempView来传递表并在pyspark中读取它

我怎么能做到呢

这是我尝试过的代码

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

相反的是密度矩阵。我希望它是数据帧的形式,我可以用它创建一个可以被pyspark访问的表

我尝试的方法是

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

但这将返回一个长格式的数据帧,因为我正在将其转换为序列。这是我能想到的最好的了。但是我需要数据帧的格式是宽格式(不是长格式)。我应该如何在scala本身的宽数据帧中转换反向密度矩阵


Tags: 数据importdfschema格式tablevaltemp