【问题标题】:Reference a java nested class in Spark Scala在 Spark Scala 中引用 java 嵌套类
【发布时间】:2015-02-26 00:21:51
【问题描述】:

我正在尝试使用交互式 Scala shell 将一些数据从 hadoop 读取到 Spark 中的 RDD,但我无法访问一些需要反序列化数据的类。

我首先导入必要的类

import com.example.ClassA

效果很好。 ClassA 位于 'jars' 路径中的 jar 中,并将 ClassB 作为公共静态嵌套类

然后我尝试像这样使用ClassB

val rawData = sc.newAPIHadoopFile(dataPath, classOf[com.exmple.mapreduce.input.Format[com.example.ClassA$ClassB]], classOf[org.apache.hadoop.io.LongWritable], classOf[com.example.ClassA$ClassB])

由于其他类之一将ClassB 作为一种类型,这有点复杂,但我认为应该没问题。

当我执行此行时,我收到以下错误:

<console>:17: error: type ClassA$ClassB is not a member of package com.example

我也尝试过使用 import 语句

import com.example.ClassA$ClassB 

而且看起来也不错。

任何关于如何进行调试的建议将不胜感激

感谢阅读。

更新:

将“$”更改为“.”引用嵌套类似乎解决了这个问题,虽然我得到了以下语法错误:

'<console>:17: error: inferred type arguments [org.apache.hadoop.io.LongWritable,com.example.ClassA.ClassB,com.example.mapredu‌​ce.input.Format[com.example.ClassA.ClassB]] do not conform to method newAPIHadoopFile's type parameter bounds [K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]]

【问题讨论】:

  • 我认为您的意思是 nested 类,而不是 subclass
  • 我应该提一下,我使用的是 Spark 1.2.0
  • 抱歉,是的,它是嵌套类而不是子类——我的错
  • 你试过使用com.example.ClassA.ClassB吗?
  • 刚刚尝试了一下,得到了 ':17: error: inferred type arguments [org.apache.hadoop.io.LongWritable,com.example.ClassA.ClassB,com.example .mapreduce.input.Format[com.example.ClassA.ClassB]] 不符合方法 newAPIHadoopFile 的类型参数界限 [K,V,F <: org.apache.hadoop.mapreduce.inputformat>

标签: scala apache-spark


【解决方案1】:

注意newAPIHadoopFile 期望的类型:

K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]

这里的重要部分是泛型类型InputFormat 需要类型KV,即方法的前两个参数的确切类型。

在你的情况下,第三个参数应该是类型

F <: org.apache.hadoop.mapreduce.InputFormat[LongWritable, ClassA.ClassB]

您的课程是否扩展了FileInputFormat&lt;LongWritable, V&gt;

【讨论】:

  • 是的,它扩展了 'org.apache.hadoop.mapreduce.lib.input.FileInputFormat' 进而扩展了 'org.apache.hadoop.mapreduce.InputFormat'
  • 对不起,我应该在这里更清楚;我的 'Format' 类被声明为 'Format extends FileInputFormat' 所以它只直接接受一个类型参数。
  • @user1111284 请发布您的 Format 类的签名及其类型参数的层次结构
  • LongWritable 是否扩展 NullWritableClassA.ClassB 是否扩展 Message
  • 对,当然——NullWritable 不扩展 LongWritable;在命令中交换它已修复它。感谢您的帮助
猜你喜欢
  • 2014-07-12
  • 2016-07-19
  • 2015-08-28
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多