#scala #apache-spark
#scala #apache-spark
Вопрос:
Я пытаюсь прочитать фрейм данных и создать приведенную ниже структуру, указанную в формате вывода.
InputDF —
id genre netid seconds team
1 A y 0 T1
1 B l 781623 M1 - S1
1 B l 623281 N1 - E1
Ожидаемый формат вывода —
[id: string (nullable = true),
genre: array ( struct (name: string, seconds: long),..),
netid: array ( struct (name: string, seconds: long),..),
team: array ( struct (name: string, seconds: long, netid: string, genre: string)]
Вывод со значением —
[id: 1,
genre: array ( struct (name: A, seconds: 0),struct (name: B, seconds: 781623),struct (name: B, seconds: 623281))
netid: array ( struct (name: y, viewedMilliseconds: 0),struct (name: l, viewedMilliseconds: 781623),struct (name: y, viewedMilliseconds: 623281))
team: array ( struct (name: A, seconds: 0, netid: y, genre: string, team:T1),struct (name: B, seconds: 781623, netid: l, genre: B, team:M1 - S1),struct (name: B, seconds: 623281, netid: l, genre: B, team:N1 - E1)]
Я не могу его создать. Может ли кто-нибудь помочь мне с этим?
Ответ №1:
Я думаю, что ваш ожидаемый результат не соответствует, но это должен быть общий подход :
import org.apache.spark.sql.functions._
import spark.implicits._
df
.groupBy($"id")
.agg(
collect_list(struct($"genre".as("name"),$"seconds")).as("genre"),
collect_list(struct($"netid".as("name"),$"seconds")).as("netid"),
collect_list(struct($"genre".as("name"),$"seconds",$"netid",$"team")).as("team")
)