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

问题描述 投票:0回答:1

这是我的数据集:

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 数据集。数据集由行组成,但是当我打印架构时,它显示一个数组。数据集如何映射到数组?每一行都是数组中的一个元素吗?

  2. 我想将我的数据集转换为案例类。

    case 类功能( s: Iterable[CustomType], a: Iterable[CustomType], tr: Iterable[CustomType], cs: Iterable[CustomType])

如何转换数据集以及如何使用编码器?

scala dataframe dataset encoder
1个回答
2
投票

首先,Spark

Row
s可以编码多种值,包括
Arrays
Structures

其次,数据框的行仅由一列类型

Array[...]
组成。

第三,如果您想从 df 创建

Dataset
,您的
case class
必须与您的模式匹配,在这种情况下,它应该类似于:

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

最后,

Encoder
用于将案例类及其值转换为 Spark 内部表示。您还不应该太担心它们 - 您只需要
import spark.implicits._
,您需要的所有编码器都会自动出现。

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

此外,您应该看看this作为参考。

© www.soinside.com 2019 - 2024. All rights reserved.