我正在尝试使用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?
暂无答案!
目前还没有任何答案,快来回答吧!