我正在尝试使用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本身的宽数据帧中转换反向密度矩阵
目前没有回答
相关问题 更多 >
编程相关推荐