如何在 RDD "org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)]" 的每一行上应用 "Sum(vi * ln(vi))"
How to apply "Sum(vi * ln(vi))" on each row of an RDD "org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)]"
我有一个具有这种结构的 RDD
org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)]
此处 RDD 的每一行包含一个索引 Long
和一个向量 org.apache.spark.mllib.linalg.Vector
。我想将以下函数应用于每行中的每个向量。
函数为:Sum(vi * ln(vi)),其中 vi = 向量的第 i 个分量。
请指导我如何在 Scala 中将此函数应用于具有上述结构的 RDD。
示例行如下所示:
Array[(Long, org.apache.spark.mllib.linalg.Vector)] =
Array((0,[0.024866109194373365,0.025451635045582396,0.024940244042347803,
0.025318245591768037,0.026531498776299952,0.02335951025503321,
0.02388238099930112,0.023397342214386187,0.024965559145567116,
0.023650490684903713,0.023343404489401316,0.024368157919182634,
0.02526665811061871,0.025846888476461573,0.025874255477319974))
我们可以尝试将您的 Vector
列转换为 Array
类型,这样我们就可以将 x * log(x)
映射到每个元素,最后 sum
结果 Array
第二次 mapValues
调用:
rdd.mapValues(_.toArray.map(x => scala.math.log(x) * x)).mapValues(_.sum)
我有一个具有这种结构的 RDD
org.apache.spark.rdd.RDD[(Long, org.apache.spark.mllib.linalg.Vector)]
此处 RDD 的每一行包含一个索引 Long
和一个向量 org.apache.spark.mllib.linalg.Vector
。我想将以下函数应用于每行中的每个向量。
函数为:Sum(vi * ln(vi)),其中 vi = 向量的第 i 个分量。
请指导我如何在 Scala 中将此函数应用于具有上述结构的 RDD。
示例行如下所示:
Array[(Long, org.apache.spark.mllib.linalg.Vector)] =
Array((0,[0.024866109194373365,0.025451635045582396,0.024940244042347803,
0.025318245591768037,0.026531498776299952,0.02335951025503321,
0.02388238099930112,0.023397342214386187,0.024965559145567116,
0.023650490684903713,0.023343404489401316,0.024368157919182634,
0.02526665811061871,0.025846888476461573,0.025874255477319974))
我们可以尝试将您的 Vector
列转换为 Array
类型,这样我们就可以将 x * log(x)
映射到每个元素,最后 sum
结果 Array
第二次 mapValues
调用:
rdd.mapValues(_.toArray.map(x => scala.math.log(x) * x)).mapValues(_.sum)