여러 개의 org.apache.hadoop 라이브러리를 기반으로하는 스칼라의 MapReduce 프레임 워크가 있습니다. 간단한 단어 카운트 프로그램으로 잘 작동합니다. 그러나, 나는 그것을 유용한 무언가에 적용하고로드 블록을 치고 싶습니다. 나는 csv 파일 (또는 어떤 구분자를 쓰는지)을 가지고 첫 번째 열을 키로 전달한 다음 키의 발생률을 계산하려고한다. 이유형 불일치를 제공하는 스칼라 MapReduce 프레임 워크
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 required : org.apache.hadoop.io.Text.
line.split ... write (_, 1)에서 _에 전달되는 문자열을 반환해야하지만 soem 이유로 it는 char라고 생각합니다. 명시 적으로 문자열을 만들도록 .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 코드 : 수입 목록
여기
입니다 내가 line
암시 여기 String
으로 변환됩니다 추측
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)
}
}
가져 오기와 build.sbt 또는 종속성 목록을 제공하여 컴파일하려고 할 수 있습니까? –
'line'은 "Hadoop Writable"'Text'이고, split을 지원하는 Java String을 얻기 위해'toString'을 호출해야합니다. 이 전화를 할 때받는 오류를 알려주십시오. –
@ThomasJungblut, "line.split (", "- 1) (0) .toString"을 사용 하시겠습니까?위와 같은 오류가 발생합니다. –