如何将具有嵌套StructType的列转换为Spark SQL中的类实例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将具有嵌套StructType的列转换为Spark SQL中的类实例?相关的知识,希望对你有一定的参考价值。
例如,student
列有StructType(("id", "int"), ("name", "string"))
| student |
| ------------|
| [123,james] |
如何使用Student
将一个列值转换为Dataset<Row>.map()
类实例?我应该将列的值视为字符串数组并解析它以构造实例吗?
答案
嵌套列值也是Row
。所以我们可以通过名称获取属性的值,然后构造一个实例。
这是一些演示代码:
scala> val df = Seq((1, "james"), (2, "tony")).toDF("id", "name")
df: org.apache.spark.sql.DataFrame = [id: int, name: string]
scala> val dd = df.select(struct("*").alias("students"))
dd: org.apache.spark.sql.DataFrame = [students: struct<id: int, name: string>]
scala> dd.show()
+--------------------+
| students|
+--------------------+
| [1,james] |
| [2,tony] |
+--------------------+
scala> rows(0).getStruct(0)
res9: org.apache.spark.sql.Row = [1,james]
我们可以看到,rows(0).getStruct(0)
返回的单元格值是Row
。
另一答案
使用编码器然后收集。
scala> val df = Seq((1, "james"), (2, "tony")).toDF("id", "name")
df: org.apache.spark.sql.DataFrame = [id: int, name: string]
scala> val dd = df.select(struct("*").alias("students"))
dd: org.apache.spark.sql.DataFrame = [students: struct<id: int, name: string>]
scala> dd.show()
+--------------------+
| students|
+--------------------+
| [1,james] |
| [2,tony] |
+--------------------+
scala> case class Student(id: Int, name: String)
defined class Student
scala> dd.select("students.*").as[Student].collectAsList
res6: java.util.List[Student] = [Student(1,james), Student(2,tony)]
以上是关于如何将具有嵌套StructType的列转换为Spark SQL中的类实例?的主要内容,如果未能解决你的问题,请参考以下文章
将包含 Json 的 Dataset<String> 转换为 Dataset<StructType>
如何在 Spark 中将 Avro Schema 对象转换为 StructType
我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?