Пользовательская строка (список пользовательских типов) для запуска данных - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время у меня возникают некоторые проблемы с созданием объекта Spark Row и преобразованием его в фрейм данных искры. То, чего я пытаюсь добиться, это:

У меня есть два списка пользовательских типов, которые более или менее похожи на классы ниже,

case class MyObject(name:String,age:Int)
case class MyObject2(xyz:String,abc:Double)

val listOne = List(MyObject("aaa",22),MyObject("sss",223)),
val listTwo = List(MyObject2("bbb",23),MyObject2("abc",2332))

Используя эти два списка, я хочу создать Dataframe, который имеет одну строку и два поля (fieldOne и fieldTwo),

  fieldOne --> is a List of StructType (similar to MyObject) 

  fieldTwo --> is a list of StructType (similar to MyObject2)

. Для этого я создал свои собственные типы структур для MyObject, MyObject2 и мой ResultType.

  val myObjSchema = StructType(List(
    StructField("name",StringType),
    StructField("age",IntegerType)
  ))

  val myObjSchema2 = StructType(List(
    StructField("xyz",StringType),
    StructField("abc",DoubleType)
  ))

  val myRecType = StructType(
    List(
      StructField("myField",ArrayType(myObjSchema)),
      StructField("myField2",ArrayType(myObjSchema2))
    )
  )

Я заполнил свои данные в объекте spark Row и создал фрейм данных

  val data = Row(
    List(MyObject("aaa",22),MyObject("sss",223)),
    List(MyObject2("bbb",23),MyObject2("abc",2332))
  )

  val df = spark.createDataFrame(
    spark.sparkContext.parallelize(Seq(data)),myRecType
  )

, когда я вызываю printSchema на фрейме данных, вывод - именно то, что я ожидал

root
 |-- myField: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- age: integer (nullable = true)
 |-- myField2: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- xyz: string (nullable = true)
 |    |    |-- abc: double (nullable = true)

Однако, когда я делаю шоу, я получаю исключение времени выполнения

Caused by: java.lang.RuntimeException: spark_utilities.example.MyObject is not a valid external type for schema of struct<name:string,age:int>

Похоже, что-то не так с объектом Row, не могли бы вы объяснить, что здесь происходит не так?

Большое спасибо за вашу помощь!

ps: я знаю, что могу создать собственный класс дел, например case class PH(ls:List[MyObject],ls2:List[MyObject2]), заполнить его и преобразовать в набор данных. Но из-за некоторых ограничений я не могу использовать этот подход и хотел бы решить его способом, упомянутым выше.

1 Ответ

1 голос
/ 26 марта 2020

Вы не можете просто вставить объекты класса case в строку, вам нужно преобразовать эти объекты в строки

val data = Row(
      List(Row("aaa",22.toInt),Row("sss",223.toInt)),
      List(Row("bbb",23d),Row("abc",2332d))
    ) 
val df = spark.createDataFrame(
      spark.sparkContext.parallelize(Seq(data)),myRecType
)
...