当前位置: 首页 > 知识库问答 >
问题:

将Scala映射转换为Databricks笔记本上的对象时出现问题

桓智敏
2023-03-14

问题

我有一个场景,需要将scala映射转换为case类对象,在以下引用的帮助下,我能够在本地实现它(scala版本2.12.13):

  1. Scala:将地图转换为案例类
  2. 将贴图转换为Scala对象

但当我尝试在Databricks笔记本中运行相同的代码块时,它抛出了一个错误:

IllegalArgumentException:无法构造'$line23851bc084ae4df7a16bf9c475868d9265的实例。$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$iw$iw$$iw$Test'(尽管至少存在一个Creator):只能通过在[Source: UNKNOWN; line:-1,列:-1]中使用默认的无参数构造函数来实例化非静态内部类

集群配置:Databricks runtime 8.2(包括Spark 3.1.1、Scala 2.12)。请参考屏幕截图了解完整代码。

解决方法(不可取)

def workaround(map: Map[String, Any]): Test = {
  Test(
    map("k1").asInstanceOf[Int],
    map("k2").asInstanceOf[String],
    map("k3").asInstanceOf[String],
  )
}

val result = workaround(myMap)

对如何解决这个问题有何想法?

共有1个答案

马才
2023-03-14

在我看来,这是两种可能性之一。

首先,我们应该仔细检查本地运行时环境和databricks运行时环境中的内容之间是否存在版本不匹配。您可以查看此页面,查看DBR 8.2中包含的所有库版本的列表。特别是,我会检查您的本地环境,以确保您运行的是相同版本的jackson(2.10.0)。

其次,这可能是数据库如何实现他们的笔记本和杰克逊的限制之间的交互。数据库笔记本的每个命令都包装在一个包对象中,该包对象被赋予了一个随机名称。例如,我可以从异常中看出保存您的Test类定义的包对象被称为$line23851bc084ae4df7a16bf9c475868d9265。$read$$iw$$iw$$iw$$iw$iw$iw$iw$iw$$iw$iw$$iw$iw$iw$iw$iw$iw。(我说它是这样命名的,因为每次您重新运行命令时它都会生成一个新的包对象)。这意味着当放在笔记本中时,所有类(和其他类型定义)实际上都是路径相关类型。更具体地说,对于这种情况,您的Test类是包对象的内部类。根据错误消息和对文档的一些简要阅读,我怀疑Jackson无法序列化路径相关类型。

 类似资料:
  • 我需要在代码的几个地方将这个映射转换为我的case类,如下所示: 最简单的方法是什么?我能用隐式吗?

  • 使用代替和代替 然后在请求属性中添加 但是当我在javascript中检索它时,我得到了jsonObject的值 我在我的项目中已经使用了下面的库,如果需要,可以使用任何新的库

  • 参考[Stackoverflow]Scala:将map转换为case类我尝试复制其中一个响应,我看到以下错误: <代码>无法构造com的实例。实践斯卡拉。Test“(不存在任何创建者,如默认构造):无法从[源:未知;行:-1,列:-1]处的对象值(无委托或基于属性的创建者)反序列化 代码: 这个错误说明了什么?我错过了什么吗?

  • 我的服务以JSONArray的形式收到响应。我想将这个JSONArray转换为JavaObject(使用POJO类)。我使用Jackson API进行JSON到JavaObject的转换。我还为该转换编写了帮助类(类名:JsonUtil)。 请在下面找到我的 JSON 响应,其中包含 JSON 对象以及 JSON 数组。 由此,如果未显示数组,则可以进行转换。如果出现数组,则表示它抛出以下错误。

  • 我有下面的pojo 此employee类用于从mybatis orm获取对象列表(list)。 mybatis将输出作为列表返回,因为mybatis不支持将Map作为返回类型 我必须把它转换成地图 我尝试了下面的方法,但没有成功,因为它需要getName()和getId()方法 请告知是否有一种方法可以在不修改员工pojo的情况下使用stream实现。 注意:我知道我们可以使用ofr或for ea