映射数组的Scala case类

映射数组的Scala case类,scala,apache-spark,dictionary,Scala,Apache Spark,Dictionary,我有python的背景,只是在学习scala。我想为通过spark从数据库读取的数据声明一个case类。数据如下所示: |id | person_info +----+------------------------------------------------------------------------------------------------------------------- | 1 |[{"fname":"john","lname":"doe","user_id":1

我有python的背景,只是在学习scala。我想为通过spark从数据库读取的数据声明一个case类。数据如下所示:

|id  |  person_info
+----+-------------------------------------------------------------------------------------------------------------------
| 1  |[{"fname":"john","lname":"doe","user_id":123,"dept":"hr"},{"fname":"jane","lname":"doe","user_id":456,"dept":"sales"}] 
| 2  |[{"fname":"ed","lname":"smith","user_id":345,"dept":"it"}] 
我对
person\u info
感到困惑,因为它也有
user\u id:Int
,这就是我所尝试的:

case class Person(id: Int, person_info: Array[Map[String, String]])
person\u info
是通过以下方式在sql中创建的:

SELECT id, named_struct("fname", t.first_name, "lname", t.lastname, "user_id": t.userid, "dept": t.department) as person_info FROM mytable t

假设person_info是有效的Json对象。它可以转换为如下所示的对象个人信息数组

case class PersonDetails(fname:String,lname:String,userId:Int,dept:String)
case class Person(id:Int,person_info:Array[PersonDetails])

假设person_info是有效的Json对象。它可以转换为如下所示的对象个人信息数组

case class PersonDetails(fname:String,lname:String,userId:Int,dept:String)
case class Person(id:Int,person_info:Array[PersonDetails])

如果字段始终相同,则可以使用嵌套的case类

final case class PersonInfoEntry(fname: String, lname: String, user_id: Int, dept: String)
final case class Person(id: Int, person_info: List[PersonInfoEntry])

如果字段始终相同,则可以使用嵌套的case类

final case class PersonInfoEntry(fname: String, lname: String, user_id: Int, dept: String)
final case class Person(id: Int, person_info: List[PersonInfoEntry])

人员信息字段是否始终相同?如果是这样的话,它们中的任何一个可能会丢失,或者所有的都必须始终存在?@LuisMiguelMejíaSuárez:这些领域总是相同的,所有的都必须始终存在present@DevEx由于我们无法访问
mytable
,因此这不算作MCVE。另外,您的问题/问题是什么如何将这样的
DataFrame
转换为类型化的
Dataset[Person]
?如果是这样,那么希曼殊或我的答案就足够了。或者您还有其他问题吗?人员信息字段是否始终相同?如果是这样的话,它们中的任何一个可能会丢失,或者所有的都必须始终存在?@LuisMiguelMejíaSuárez:这些领域总是相同的,所有的都必须始终存在present@DevEx由于我们无法访问
mytable
,因此这不算作MCVE。另外,您的问题/问题是什么如何将这样的
DataFrame
转换为类型化的
Dataset[Person]
?如果是这样,那么希曼殊或我的答案就足够了。或者你还有其他问题吗?