Ошибка, которую вы видите, должна быть почти понятной. Существует строгое сопоставление типов 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")
Измените .split(Pattern.quote(","));
на шаблон регулярного выражения, соответствующий пробелу до и после запятой (которую не нужно заключать в кавычки). Например,
.split("\\s*,\\s*");
с этим изменением я получаю
Varibels : name1, name2, name3
names: name1
names: name2
names: name3