【问题标题】:transform dataset into case class via (wrapped) encoders通过(包装的)编码器将数据集转换为案例类
【发布时间】:2019-04-26 04:49:45
【问题描述】:

我是 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])

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

非常感谢。

【问题讨论】:

    标签: scala dataframe dataset encoder


    【解决方案1】:

    欢迎使用 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 作为参考。

    【讨论】:

    • 你好。你为什么这么卑鄙?我说我不明白这个话题。无论如何,我还是谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2014-12-18
    相关资源
    最近更新 更多