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

spark 2.0上的编译编码器错误

淳于新
2023-03-14

我试图从spark 1.6迁移到2.0,但仅在2.0上编译时出现以下错误:

def getSubGroupCount(df: DataFrame, colNames: String): Array[Seq[Any]] = {
   val columns: Array[String] = colNames.split(',')
   val subGroupCount: Array[Seq[Any]] = columns.map(c => df.select(c).distinct.map(x => x.get(0)).collect.toSeq)
    subGroupCount
  }

无法找到存储在数据集中的类型的编码器。导入支持原始类型(Int、String等)和产品类型(case类)spark.implicits._将在未来版本中添加对序列化其他类型的支持。val subGroupCount: Array[Seq[any]]=columns.map(c=

问候

共有1个答案

孟乐逸
2023-03-14

方法< code>DataFrame.map在不同版本之间发生了变化:

> < li>

在Spark 1.6中,它对底层< code>RDD[Row]进行操作,并返回一个< code>RDD:

def map[R](f: (Row) ⇒ R)(implicit arg0: ClassTag[R]): RDD[R]

在Spark 2.0中,< code>DataFrame只是< code>Dataset[Row]的别名,因此它返回一个< code>Dataset:

def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U] 

如您所见,后者需要一个隐式编码器参数,该参数在您的案例中是缺少的。

为什么编码器不见了?

首先,一旦导入< code>spark.implicits._,所有默认编码器都将在范围内。但是,由于映射的结果类型是< code>Any (x =

如何解决这个问题?

> < li>

如果您感兴趣的所有列都有一个通用类型(例如,< code>String),您可以使用< code>getAs[String](0)使映射函数的返回类型特定。一旦添加了上面提到的导入,这些类型(原语、产品)将在范围内有一个匹配的编码器

如果您没有所有相关列通用的已知类型,并且希望保留相同的行为-您可以使用. rdd获取Dataframe的RDD并使用该RDD的map操作,这将与2.0之前的行为相同:

columns.map(c => df.select(c).distinct.rdd.map(x => x.get(0)).collect.toSeq)
 类似资料:
  • 我最近在部署到我们的共享主机时遇到了问题。从 Visual Studio 通过 Web 部署进行部署时,99% 的时间我在登录后在登录页面或主页上收到此错误。有时我可能会点击几下不同的部分,然后它就会击中。它通常会在几分钟到90分钟后消失。 运行Windows Server 2012 R2 Standard、IIS8和.NET 4.5的Web主机。 Web主机建议我需要使用Visual Studi

  • 请帮帮我!我找不到此问题的任何解决方案 “/”应用程序中的服务器错误。< br >编译错误< br >描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改您的源代码。 编译器错误消息: 编译器失败,错误代码为-2146232576。 显示详细的编译器输出: C:\Windows\System32\inetsrv 版本信息: 微软 .NET 框架版本:4.0.30319;AS

  • 从事maven项目。我试图使用maven进行构建,但我遇到了以下错误!我正在使用JDK 8开发eclipse。 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:2.3.2:编译(默认编译) 我也尝试了上面的解决方案,但我仍然得到错误!

  • 问题内容: 以下代码给出了编译器错误 有时出于测试目的,希望防止某个方法被调用,因此一种快速执行此方法(而不是在使用 该方法的位置处将其注释掉)的方法是立即从该方法返回,以便该方法不执行任何操作。然后,我总是做些什么来解决编译器错误,这是 我很好奇,为什么会出现编译器错误?它会以某种方式破坏Java字节码,是为了保护程序员还是其他? 同样(这对我来说更有趣),如果将Java编译为字节码可以进行任何