- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些数据存储为 Parquet 文件和与数据模式匹配的案例类。 Spark 可以很好地处理常规产品类型,所以如果我有
case class A(s:String, i:Int)
我可以轻松做到
spark.read.parquet(file).as[A]
但据我了解,Spark 不处理析取类型,因此当我的 parquet 中有枚举时,之前编码为整数,以及像这样的 scala 表示形式
sealed trait E
case object A extends E
case object B extends E
我做不到
spark.read.parquet(file).as[E]
// java.lang.UnsupportedOperationException: No Encoder found for E
到目前为止是有道理的,但后来,可能太天真了,我尝试了
implicit val eEncoder = new org.apache.spark.sql.Encoder[E] {
def clsTag = ClassTag(classOf[E])
def schema = StructType(StructField("e", IntegerType, nullable = false)::Nil)
}
我仍然得到相同的“没有为 E 找到编码器”:(
此时我的问题是,为什么范围内隐式缺失? (或者不被识别为编码器[E]),即使它被识别,这样的接口(interface)如何让我真正解码数据?我仍然需要将值映射到正确的案例对象。
我确实读过a related answer上面写着“TL;DR 目前还没有好的解决方案,并且考虑到 Spark SQL/数据集的实现,在可预见的将来不太可能有一个解决方案。”但我很难理解为什么自定义编码器无法做到这一点。
最佳答案
But I'm struggling to understand why a custom Encoder couldn't do the trick.
两个主要原因:
没有用于自定义编码器
的 API。公开可用的只有“二进制”Kryo 和 Java Encoders
,它们会创建无用的(在 DataFrame
/Dataset[Row]
的情况下)blob,且不包含任何内容。支持任何有意义的 SQL/DataFrame
操作。
这样的代码可以正常工作
import org.apache.spark.sql.Encoders
spark.createDataset(Seq(A, B): Seq[E])(Encoders.kryo[E])
但这只不过是一种好奇心。
DataFrame
是一个列式存储。从技术上讲,可以在此结构之上对类型层次结构进行编码(私有(private) UserDefinedType
API 就是这样做的),但它很麻烦(因为您必须为所有可能的变体提供存储,例如参见 How to define schema for custom type in Spark SQL? )而且效率低下(一般来说,复杂类型在 Spark SQL 中多少是二等公民,并且许多优化无法通过复杂模式实现,可能会在未来发生变化)。
在更广泛的意义上,DataFrame
API 是有效的关系型 API(如 relational algebra ),并且元组(关系的主要构建 block )根据定义是同质的,因此通过扩展,在 SQL/DataFrame
API,用于异构结构。
关于scala - Spark 数据框到密封特征类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50926555/
当数据类扩展包含非抽象 open val 属性的密封类时,生成的子数据类包含与父类的私有(private)字段重复的私有(private)字段。 sealed class Foo(open val f
当封装一个.jar 文件(整个.jar,而不是特定的包)时,实际上封装了哪些包?它只是包含.class 文件的包,还是还包含父包和子包? 举个例子,假设我有一个包含单个 .class 文件 com.c
我可以很容易地为这样的密封案例类族一般派生一个编解码器: import io.circe._ import io.circe.generic.auto._ sealed trait Base case
我有一个类层次结构: class C1 { virtual object M1(); } class C2: C1 { override sealed object M1(); } class C3:
有什么区别: type MovieType = {| +blob?: string, +name: string, +url?: string |}; 和 type MovieType =
想象一个这样的 secret : apiVersion: v1 kind: Secret metadata: name: {{ include "test-cicd.fullname" . }}
因此,我的一位开发人员使用这样的函数为 Magento 电子商务网站制作自定义导航: getUrl() ?>">__('about') ?> 唯一的问题是它的输出如下: about 据我了解,如果同时
我是一名优秀的程序员,十分优秀!