【发布时间】:2022-01-21 08:38:06
【问题描述】:
我是 scala 的新手,我迫切需要一些关于以下问题的指导:
我有一个如下所示的数据框(某些元素可能为 NULL)
val dfDouble = Seq(
(1.0, 1.0, 1.0, 3.0),
(1.0, 2.0, 0.0, 0.0),
(1.0, 3.0, 1.0, 1.0),
(1.0, 4.0, 0.0, 2.0)).toDF("m1", "m2", "m3", "m4")
dfDouble.show
+---+---+---+---+
| m1| m2| m3| m4|
+---+---+---+---+
|1.0|1.0|1.0|3.0|
|1.0|2.0|0.0|0.0|
|1.0|3.0|1.0|1.0|
|1.0|4.0|0.0|2.0|
+---+---+---+---+
我需要从此数据框中获取以下统计信息:
- 包含每列平均值的向量(某些元素可能为 NULL,我想仅使用非 NULL 元素计算平均值);我还想按名称引用向量的每个元素,例如,vec_mean["m1_mean"] 将返回第一个元素
vec_mean: Vector(m1_mean, m2_mean, m3_mean, m4_mean)
-
一个方差-协方差矩阵,即 (4 x 4),其中对角线是
var(m1), var(m2),...,,非对角线是cov(m1,m2), cov(m1,m3) ...在这里,我还想只使用方差中的非 NULL 元素-协方差计算 -
包含每列非空数的向量
vec_n: Vector(m1_n, m2_n, m3_n, m4_n)
- 包含每列标准差的向量
vec_stdev: Vector(m1_stde, m2_stde, m3_stde, m4_stde)
在 R 中,我会将所有内容都转换为矩阵,然后剩下的就很简单了。但是在scala中,我对矩阵不熟悉,而且显然有多种类型的矩阵,令人困惑(DenseMatrix、IndexedMatrix等)
已编辑:如果数据框的内容是 Double 或 Int,显然会有所不同。将元素修改为双重
根据建议的答案使用以下命令并且它有效!
val rdd = dfDouble0.rdd.map {
case a: Row => (0 until a.length).foldRight(Array[Double]())((b, acc) =>
{ val k = a.getAs[Double](b)
if(k == null)
acc.+:(0.0)
else acc.+:(k)}).map(_.toDouble)
}
【问题讨论】:
标签: dataframe scala apache-spark matrix variance