View([function_name])
- например. View(mean)
Обязательно используйте верхний регистр [V]. В редакторе откроется код только для чтения.
Ошибка, которую вы видите, должна быть почти понятной. Существует строгое сопоставление типов Catalyst / SQL и типов Scala, которые можно найти в в соответствующем разделе из справочника Spark SQL, DataFrames и Datasets Guide .
В частности, типы struct
преобразуются в o.a.s.sql.Row
(в вашем конкретном случае данные будут отображаться как Seq[Row]
).
Существуют разные методы, которые могут использоваться для отображения данных как конкретных типов :
DataFrame
в Dataset[T]
, где T
является искомым локальным типом. с использованием только прежнего подхода может быть применимым в этом конкретный сценарий.
Если вы хотите получить доступ к investments.funding_round.raised_amount
с помощью UDF, вам понадобится что-то вроде этого:
val getRaisedAmount = udf((investments: Seq[Row]) => scala.util.Try(
investments.map(_.getAs[Row]("funding_round").getAs[Long]("raised_amount"))
).toOption)
, но простой select
должен быть намного безопаснее и чище:
df.select($"investments.funding_round.raised_amount")
Я создал простую библиотеку, которая выводит необходимые кодеры для сложных типов продуктов на основе параметров входного типа.
https://github.com/lesbroot/typedudf
import typedudf.TypedUdf
import typedudf.ParamEncoder._
case class Foo(x: Int, y: String)
val fooUdf = TypedUdf((foo: Foo) => foo.x + foo.y.length)
df.withColumn("sum", fooUdf($"foo"))