scala 通过( Package 的)编码器将数据集转换为案例类

rslzwgfq  于 7个月前  发布在  Scala
关注(0)|答案(1)|浏览(51)

这是我的数据集:

val bfDS = sessions.select("bf")
sessions.select("bf").printSchema

 |-- bf: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- s: struct (nullable = true)
 |    |    |    |-- a: string (nullable = true)
 |    |    |    |-- b: string (nullable = true)
 |    |    |    |-- c: string (nullable = true)
 |    |    |-- a: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- a: string (nullable = true)
 |    |    |    |    |    |-- b: integer (nullable = true)
 |    |    |    |    |    |-- c: long (nullable = true)
 |    |    |-- tr: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- e: string (nullable = true)
 |    |    |    |    |    |-- f: integer (nullable = true)
 |    |    |    |    |    |-- g: long (nullable = true)
 |    |    |-- cs: struct (nullable = true)
 |    |    |    |-- a: integer (nullable = true)
 |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- c: integer (nullable = true)
 |    |    |    |-- d: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- e: string (nullable = true)
 |    |    |    |    |    |-- f: integer (nullable = true)
 |    |    |    |    |    |-- g: long (nullable = true)

字符串
1.我想我不是很了解Scala数据集。数据集是由行组成的,但是当我打印架构时,它显示的是一个数组。数据集如何Map到数组?每行是数组中的一个元素吗?
1.我想把我的数据集转换成一个case类。
case类特性(s:可迭代[自定义类型],a:可迭代[自定义类型],tr:可迭代[自定义类型],cs:可迭代[自定义类型])
如何转换数据集以及如何使用编码器?

yws3nbqq

yws3nbqq1#

首先,Spark Row s可以编码各种值,包括ArraysStructures
其次,您的嵌套框架的行仅由一个Array[...]类型的列组成。
第三,如果你想从你的df创建一个Dataset,你的case class必须匹配你的schema,在这种情况下,它应该是这样的:

case class Features(array: Array[Elements])
case class Elements(s: CustomType, a: CustomType, tr: CustomType, cs: CustomType)

字符串
最后,Encoder用于将case类及其值转换为Spark内部表示。您不应该太在意它们-您只需要import spark.implicits._,所有需要的编码器都会自动出现。

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val ds: Dataset[Features] = df.as[Features]


另外,你应该看看this作为参考。

相关问题