Java Scala MapReduce框架提供类型不匹配

Java Scala MapReduce框架提供类型不匹配,java,scala,hadoop,mapreduce,Java,Scala,Hadoop,Mapreduce,我在Scala中有一个基于org.apache.hadoop库的MapReduce框架。它与简单的字数计算程序配合使用效果很好。然而,我想把它应用到一些有用的东西上,我遇到了一个障碍。我想获取一个csv文件(或者任何分隔符),并将第1列中的任何内容作为键传递,然后计算键的发生率 映射程序代码如下所示 class WordCountMapper extends Mapper[LongWritable, Text, Text, LongWritable] with HImplicits { pr

我在Scala中有一个基于org.apache.hadoop库的MapReduce框架。它与简单的字数计算程序配合使用效果很好。然而,我想把它应用到一些有用的东西上,我遇到了一个障碍。我想获取一个csv文件(或者任何分隔符),并将第1列中的任何内容作为键传递,然后计算键的发生率

映射程序代码如下所示

class WordCountMapper extends Mapper[LongWritable, Text, Text, LongWritable] with HImplicits {
  protected override def map(lnNumber: LongWritable, line: Text, context: Mapper[LongWritable, Text, Text, LongWritable]#Context): Unit = {
  line.split(",", -1)(0) foreach (context.write(_,1))  //Splits data
  }
}
问题出现在“line.split”代码中。当我试图编译它时,我得到一个错误,它说:

找到:char 必需:org.apache.hadoop.io.Text

行,分开。。。应该返回一个字符串,该字符串在写入时传递给u(u,1),但出于soem原因,它认为它是一个字符。我甚至添加了.toString来显式地将其设置为字符串,但这也不起作用

欢迎提出任何意见。让我知道我可以提供哪些其他详细信息

更新:

以下是进口清单:

import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapreduce.{Reducer, Job, Mapper}
import org.apache.hadoop.conf.{Configured}
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat
import scala.collection.JavaConversions._
import org.apache.hadoop.util.{ToolRunner, Tool}
以下是build.sbt代码:

import AssemblyKeys._ // put this at the top of the file

assemblySettings

organization := "scala"

name := "WordCount"

version := "1.0"

scalaVersion:= "2.11.2"

scalacOptions ++= Seq("-no-specialization", "-deprecation")

libraryDependencies ++= Seq("org.apache.hadoop" % "hadoop-client" % "1.2.1",
                        "org.apache.hadoop" % "hadoop-core" % "latest.integration" exclude ("hadoop-core", "org/apache/hadoop/hdfs/protocol/ClientDatanodeProtocol.class") ,
                        "org.apache.hadoop" % "hadoop-common" % "2.5.1",
                        "org.apache.hadoop" % "hadoop-mapreduce-client-core" % "2.5.1",
                        "commons-configuration" % "commons-configuration" % "1.9",
                        "org.apache.hadoop" % "hadoop-hdfs" % "latest.integration")


 jarName in assembly := "WordCount.jar"

 mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {case s if s.endsWith(".class") => MergeStrategy.last
case s if s.endsWith(".xsd") => MergeStrategy.last
case s if s.endsWith(".dtd") => MergeStrategy.last
case s if s.endsWith(".xml") => MergeStrategy.last
case s if s.endsWith(".properties") => MergeStrategy.last
case x => old(x)
  }
}
import AssemblyKeys.\u//将其放在文件的顶部
装配设置
组织:=“scala”
名称:=“字数”
版本:=“1.0”
规模规避:=“2.11.2”
scalacOptions++=Seq(“-no-specialization”、“-deprecation”)
libraryDependencies++=Seq(“org.apache.hadoop”%”hadoop客户端“%”1.2.1“,
“org.apache.hadoop”%“hadoop core”%“latest.integration”排除(“hadoop core”、“org/apache/hadoop/hdfs/protocol/ClientDatanodeProtocol.class”),
“org.apache.hadoop”%“hadoop通用”%“2.5.1”,
“org.apache.hadoop”%”hadoop mapreduce客户端核心“%”2.5.1“,
“公用配置”%“公用配置”%“1.9”,
“org.apache.hadoop”%“hadoop hdfs”%“latest.integration”)
程序集中的jarName:=“WordCount.jar”
程序集mergeStrategy.last中的mergeStrategy
如果s.endsWith(“.xsd”)=>MergeStrategy.last
如果s.endsWith(“.dtd”)=>MergeStrategy.last
如果s.endsWith(“.xml”)=>MergeStrategy.last
如果s.endsWith(“.properties”)=>MergeStrategy.last
案例x=>旧(x)
}
}

我猜
在这里被隐式转换为
字符串
(多亏了
HImplicits
?)。那么我们有

line.split(",", -1)(0) foreach somethigOrOther
  • 将字符串拆分为多个字符串-
    。拆分(…)
  • 取这些字符串中的第0个-
    (0)
  • 然后在该字符串的字符上迭代
    somethingOrOther
    foreach

这样你就得到了你的
char

我实际上解决了这个问题,没有使用u.符号,只是直接在context.write中指定值。因此,不是:

line.split(",", -1)(0) foreach (context.write(_,1))
我用过:

context.write(line.split(",", -1)(0), 1)

我在网上发现一条消息,说Scala在使用x时会对数据类型感到困惑,建议只显式地定义适当的值。不确定这是否正确,但它解决了本例中的问题。

您可以提供您的导入和build.sbt或依赖项列表,以便我可以尝试编译它吗?
line
是一个“Hadoop可写的”
Text
,您需要调用
toString
从中获取支持拆分的Java字符串。您应该告诉我们您在执行此调用时遇到的错误。@ThomasJungblut,您的意思是使用“line.split(“,”,-1)(0).toString”吗?这会产生与上述相同的错误。@EricZoerner我添加了您请求的信息。“如果还有别的事,请告诉我。”不,我补充了一个答案<代码>行需要是一个字符串。与
无关
,一切都与不再不必要地调用
foreach
有关。这很有意义。我想是因为它只传递了一个字符串(第0项),所以它并不重要,只会在这一项上迭代一次。但我猜它是在一个字符串中的每个字符上迭代的。