В настоящее время у меня возникают некоторые проблемы с созданием объекта 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])
, заполнить его и преобразовать в набор данных. Но из-за некоторых ограничений я не могу использовать этот подход и хотел бы решить его способом, упомянутым выше.