我是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])
如何转换数据集以及如何使用编码器?
非常感谢。
答案 0 :(得分:2)
欢迎使用 StackOverflow 。可悲的是,这个问题对于 SO 来说太难了,请查看"how to ask"来改进此问题以及以后的问题。
但是,我将尝试回答您的几个问题。
首先,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。