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

时间:2018-11-23 15:02:33

标签: scala dataframe dataset encoder

我是Scala的新手。请原谅我缺乏知识。 这是我的数据集:

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 class Features( s: Iterable[CustomType], a: Iterable[CustomType], tr: Iterable[CustomType], cs: Iterable[CustomType])

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

非常感谢。

1 个答案:

答案 0 :(得分:2)

欢迎使用 StackOverflow 。可悲的是,这个问题对于 SO 来说太难了,请查看"how to ask"来改进此问题以及以后的问题。
但是,我将尝试回答您的几个问题。


首先,Spark Rows可以编码各种值,包括ArraysStructures

第二,数据框的行仅由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