создайте настраиваемый вывод в виде структуры массива результата запроса с использованием Spark, Scala

#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")
  )