[英]How to create a TypedColumn in a Spark Dataset and manipulate it?
我正在嘗試使用mapGroups
執行聚合,該聚合返回SparseMatrix作為列之一,並對列求和。
我為映射的行創建了一個case class
架構,以提供列名。 矩陣列的類型為org.apache.spark.mllib.linalg.Matrix
。 如果我在執行聚合( select(sum("mycolumn")
)之前未運行toDF
, select(sum("mycolumn")
收到一種類型不匹配錯誤( required: org.apache.spark.sql.TypedColumn[MySchema,?]
)。如果包含toDF
我收到另一個類型不匹配錯誤: cannot resolve 'sum(mycolumn)' due to data type mismatch: function sum requires numeric types, not org.apache.spark.mllib.linalg.MatrixUDT
。那么正確的方法是什么?
您似乎在這里遇到至少兩個不同的問題。 假設您具有這樣的Dataset
:
val ds = Seq(
("foo", Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))),
("foo", Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0)))
).toDS
選擇TypedColumn
:
使用$
進行隱式轉換:
ds.select(col("_1").as[String])
使用oassql.functions.col
:
ds.select(col("_1").as[String])
添加矩陣:
Matrix
和MatrixUDT
不實現加法。 這意味着您將無法使用+
sum
或sum
如果您真的想與Datsets
一起Datsets
,可以嘗試執行以下操作:
ds.groupByKey(_._1).mapGroups(
(key, values) => {
val matrices = values.map(_._2.toArray)
val first = matrices.next
val sum = matrices.foldLeft(first)(
(acc, m) => acc.zip(m).map { case (x, y) => x + y }
)
(key, sum)
})
並映射回矩陣,但就我個人而言,我只是轉換為RDD並使用breeze
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.