如何解决基于字符串的 Spark 和 Shapeless 标记类型的问题

问题描述

这是一个按预期工作的示例 DataBrick 笔记本段落:

import shapeless.tag
import shapeless.tag.@@
import org.apache.spark.sql.Dataset

trait FooTag

type Foo = Int @@ FooTag

val foo1: Foo = tag[FooTag][Int](1)
val foo2: Foo = tag[FooTag][Int](2)
val foo3: Foo = tag[FooTag][Int](3)
val foo4: Foo = tag[FooTag][Int](4)

case class Event(id: Int,foo: Foo)

val ds: Dataset[Event] = Seq((1,foo1),(2,foo2),(3,foo3),(4,foo4)).toDF("id","foo").as[Event]
display(ds)

如果我尝试完全相同的模式,但使用 String 而不是 Int,并尝试运行它,我会收到此错误

java.lang.classNotFoundException: 没有找到对应于 的 Java 类

知道可能是什么问题吗?我该如何解决?我可以只使用原语作为标记类型的基础并与 Spark 兼容吗?

我使用的是 Spark 2.4.0、Scala 2.11.12 和 Shapeless 2.3.3。

这是相同的示例,但使用失败的 String

import shapeless.tag
import shapeless.tag.@@
import org.apache.spark.sql.Dataset

trait FooTag

type Foo = String @@ FooTag

val foo1: Foo = tag[FooTag][String]("1")
val foo2: Foo = tag[FooTag][String]("2")
val foo3: Foo = tag[FooTag][String]("3")
val foo4: Foo = tag[FooTag][String]("4")

case class Event(id: Int,"foo").as[Event]
display(ds)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)