簡體   English   中英

如何在Spark數據集中創建TypedColumn並進行操作?

[英]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") )之前未運行toDFselect(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]) 

添加矩陣:

  • MLLib MatrixMatrixUDT不實現加法。 這意味着您將無法使用+ sumsum
  • 您可以使用第三方線性代數庫,但Spark SQL / Spark Dataset不支持此功能

如果您真的想與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM